1、JWT 是什么?
JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方之间以 JSON 对象的形式安全传递信息的方法。JWT 可以使用 HMAC 算法或者是 RSA 的公钥密钥对进行签名。
简单来说,就是通过一定规范来生成 token,然后可以通过解密算法逆向解密 token,这样就可以获取用户信息。
优点:
1)生产的 token 可以包含基本信息,比如 id、用户昵称、头像等信息,避免再次查库
2)存储在客户端,不占用服务端的内存资源
缺点:
token 是经过 base64 编码,所以可以解码,因此 token 加密前的对象不应该包含敏感信息,如用户权限,密码等
2、JWT 格式组成:头部、负载、签名
header+payload+signature
头部:主要是描述签名算法
负载:主要描述是加密对象的信息,如用户的id等,也可以加些规范里面的东西,如 iss 签发者,exp 过期时间,sub 面向的用户
签名:主要是把前面两部分进行加密,防止别人拿到 token 进行 base 解密后篡改 token
3、关于jwt客户端存储
可以存储在 Cookie,localStorage 和 sessionStorage 里面
4、引入相关依赖并开发 JWT 工具类
1)引入依赖
<!-- JWT相关 --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.7.0</version> </dependency>
2)开发生产 token 方法
3)开发检验 token 方法
package com.haitaiinc.clinicpathservice.utils; import com.haitaiinc.clinicpathservice.entity.UserInfo; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.util.StringUtils; import java.util.Date; public class JwtUtils { public static final String SUBJECT = "admin"; /** * 过期时间,毫秒,一周 */ public static final long EXPIRE = 1000 * 60 * 60 * 24 * 7; /** * 秘钥 */ public static final String APPSECRET = "haitaiinc"; /** * 生成jwt * * @param userInfo * @return */ public static String geneJsonWebToken(UserInfo userInfo) { if (userInfo == null || StringUtils.isEmpty(userInfo.getUserId()) || StringUtils.isEmpty(userInfo.getUserName())) { return null; } String token = Jwts.builder().setSubject(SUBJECT) .claim("id", userInfo.getUserId()) .claim("name", userInfo.getUserName()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) .signWith(SignatureAlgorithm.HS256, APPSECRET).compact(); return token; } /** * 校验token * * @param token * @return */ public static Claims checkJWT(String token) { try { final Claims claims = Jwts.parser().setSigningKey(APPSECRET). parseClaimsJws(token).getBody(); return claims; } catch (Exception e) { } return null; } }
4)测试
package com.haitaiinc.clinicpathservice; import com.haitaiinc.clinicpathservice.entity.UserInfo; import com.haitaiinc.clinicpathservice.utils.JwtUtils; import io.jsonwebtoken.Claims; import org.junit.jupiter.api.Test; public class CommonTest { @Test public void testGeneJwt() { UserInfo user = new UserInfo(); user.setUserId("admin"); user.setUserName("管理员"); String token = JwtUtils.geneJsonWebToken(user); System.out.println(token); } @Test public void testCheck() { String token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlkIjoiYWRtaW4iLCJuYW1lIjoi566h55CG5ZGYIiwiaWF0IjoxNTc3NTU3MDU1LCJleHAiOjE1NzgxNjE4NTV9.VrrKtCTnxVN76JhpyIusCGq9Wj89wLor0OqIJ6s0zXo"; Claims claims = JwtUtils.checkJWT(token); if (claims != null) { String id = (String) claims.get("id"); String name = (String) claims.get("name"); System.out.println(id); System.out.println(name); } else { System.out.println("非法token"); } } }
以上就是Spring Boot 整合 JWT的方法的详细内容,更多关于Spring Boot 整合 JWT的资料请关注小牛知识库其它相关文章!
本文向大家介绍Springboot整合activemq的方法步骤,包括了Springboot整合activemq的方法步骤的使用技巧和注意事项,需要的朋友参考一下 今天呢心血来潮,也有很多以前的学弟问到我关于消息队列的一些问题,有个刚入门,有的有问题都来问我,那么今天来说说如何快速入门mq。 一、首先说下什么是消息队列? 1.消息队列是在消息的传输过程中保存消息的容器。 二、为什么要用到消息队列?
本文向大家介绍SpringBoot整合liquibase的实现方法,包括了SpringBoot整合liquibase的实现方法的使用技巧和注意事项,需要的朋友参考一下 LiquiBase 是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态。它的目标是提供一种数据库类型无关的解决方案,通过执行schema类型的文件来达到
本文向大家介绍SpringBoot整合Swagger的方法示例,包括了SpringBoot整合Swagger的方法示例的使用技巧和注意事项,需要的朋友参考一下 依赖 配置类 启动类 在springBoot的启动类上添加一个注解即可配置成功: @EnableSwagger2 访问api的路径 http://ip/projectName/swagger-ui.html 注解说明 @Api 标注在类上,
本文向大家介绍SpringBoot 整合Redis 数据库的方法,包括了SpringBoot 整合Redis 数据库的方法的使用技巧和注意事项,需要的朋友参考一下 Redis简介 Redis(官网: https://redis.io )是一个基于内存的日志型可持久化的缓存数据库,保存形式为key-value格式,Redis完全免费开源,它使用ANSI C语言编写。与其他的key - value缓存
本文向大家介绍springboot整合EHCache的实践方案,包括了springboot整合EHCache的实践方案的使用技巧和注意事项,需要的朋友参考一下 EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。 ehcache提供了多种缓存策略,主要分为内存和磁盘两级,所以无需担心容量问题。 spring-bo
本文向大家介绍SpringBoot整合Redis的步骤,包括了SpringBoot整合Redis的步骤的使用技巧和注意事项,需要的朋友参考一下 1.添加配置文件: Redis.properties 设置配置类: RedisConfig 2.将对象转化为Json格式入门案例 API: MAPPER.writeValueAsString(itemDesc); 3.将对象转化为Json格式格式优化 4.
本文向大家介绍Springboot整合Shiro之加盐MD5加密的方法,包括了Springboot整合Shiro之加盐MD5加密的方法的使用技巧和注意事项,需要的朋友参考一下 1.自定义realm,在Shiro的配置类中加入以下bean 2.重写方法 需要注意的是SimpleAuthenticationInfo 类,我们需要把数据交给他,格式为(用户,用户密码,盐,当前Realm的类名) 3.你还
本文向大家介绍springboot快速整合Mybatis组件的方法(推荐),包括了springboot快速整合Mybatis组件的方法(推荐)的使用技巧和注意事项,需要的朋友参考一下 Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化