目录
1.介绍
1.1为什么会有Jwt出现?
1.2什么是Jwt?
2.使用Jwt
2.1导入依赖
2.2创建Jwt方法
2.3解析jwt方法
2.4判断Jwt是否正确
2.5测试
2.6完整使用步骤
1.介绍
1.1为什么会有Jwt出现?
在聊Jwt之前,我们先聊聊不使用前后端分离使用spring业务开发,页面资源都在resource目录下。那么在做登录的时候,我们往往会将用户信息存入session当中,进入页面之前判断是否有session,有就放行,没有就让你登录。但是如果spring前后端分离了,那么就不能存session,并且cookie和session要禁用,为什么?因为Spring mvc跨域配置中,默认是不允许携带cookie与头信息,sessionID又是保存在cookie里面,cookie都拿不到,那session就不用多说。关键还是跨域问题,浏览器默认对跨域请求的 Cookie 设置有限制SameSite
策略可能会阻止跨域发送 Cookie。但是使用 Token(如 JWT)可以通过 HTTP 标头(如 Authorization
)传递,不受跨域限制,从而代替session与cookie
1.2什么是Jwt?
jwt可以理解为是一个将身份信息加密后生成很长的字符串,加密算法可以自由选择。并且可以设置过期时间。常用于身份验证和信息交换场景,通常由三部分组成,Header(头部),Payload有效(载荷),Signature(签名)。他的工作原理就是后端生成jwt,前端接收到后存入本地比如浏览器的local storage,后续每次请求都会将信息放在请求头中,后端通过请求头取出来解析判断jwt是否正确,并做出相对于的策略。
2.使用Jwt
2.1导入依赖
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.12.5</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.12.5</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.12.5</version></dependency>
2.2创建Jwt方法
其实如果真正想用,只需要.claims(加密的内容),.signWith(加密的算法),builder.expiration()设置过期时间。其余的都是规范问题,核心就是设置这三个就可以用。
java">/*** 创建token* @param payload 数据载体* @param ttl 过期时间* @return JWT*/public static String createToken(Map<String, Object> payload, long ttl) {JwtBuilder builder = Jwts.builder()//采用HS256加密算法对JWT进行签名.signWith(Jwts.SIG.HS256.key().random(new SecureRandom(SECRET.getBytes())).build())//JWT的唯一标识.id(UUID.randomUUID().toString())//设置载体内容.claims(payload)//设置签发人.issuer("org.xxx")//主题.subject("JWT_AUTH")//JWT颁发时间.issuedAt(new Date());//设置过期时间if(ttl >= 0) {builder.expiration(getExpDate(ttl));}//创建JWTreturn builder.compact();}
/*** 计算过期时间* @param ttl* @return*/private static Date getExpDate(long ttl) {Date expDate = new Date(System.currentTimeMillis() + ttl);System.out.println("Token过期时间:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(expDate));return expDate;}
2.3解析jwt方法
怎么加密,那就怎么解析。算法必须一致。
java">/*** 解析token,获取载体数据* @param token JWT* @param type 载体数据的类型* @return* @param <T>*/public static <T> T parseToken(String token, String name, Class<T> type) {return Jwts.parser().verifyWith(Jwts.SIG.HS256.key().random(new SecureRandom(SECRET.getBytes())).build()).build().parseSignedClaims(token).getPayload().get(name, type);}
2.4判断Jwt是否正确
java"> /*** 校验token* @param token*/public static void verify(String token) {Jwts.parser().verifyWith(Jwts.SIG.HS256.key().random(new SecureRandom(SECRET.getBytes())).build()).build().parseSignedClaims(token);}
2.5测试
java">public static void main(String[] args) {Map<String, Object> payload = new HashMap<>();payload.put("name", "user1");System.out.println(JwtUtils.createToken(payload, 1000 * 60 * 60 * 24));}
2.6完整使用步骤
1.登录成功在service层调用createToken方法,完成生成给vo一并返回给前端。
2.前端通过请求回调获取jwt,并保存在local storage中。
3.每次请求都从local storage取出jwt,放在请求头中发给后端。
4.后端就可以通过拦截器获取请求头的信息,为了全文使用,后端可以将请求信息存入到session作用域中。