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)引入依赖
1<!-- JWT相关 --> 2<dependency> 3 <groupId>io.jsonwebtoken</groupId> 4 <artifactId>jjwt</artifactId> 5 <version>0.7.0</version> 6</dependency>
2)开发生产 token 方法
3)开发检验 token 方法
1package com.haitaiinc.clinicpathservice.utils; 2 3import com.haitaiinc.clinicpathservice.entity.UserInfo; 4import io.jsonwebtoken.Claims; 5import io.jsonwebtoken.Jwts; 6import io.jsonwebtoken.SignatureAlgorithm; 7import org.springframework.util.StringUtils; 8 9import java.util.Date; 10 11public class JwtUtils { 12 public static final String SUBJECT = "admin"; 13 14 /** 15 * 过期时间,毫秒,一周 16 */ 17 public static final long EXPIRE = 1000 * 60 * 60 * 24 * 7; 18 19 /** 20 * 秘钥 21 */ 22 public static final String APPSECRET = "haitaiinc"; 23 24 /** 25 * 生成jwt 26 * 27 * @param userInfo 28 * @return 29 */ 30 public static String geneJsonWebToken(UserInfo userInfo) { 31 32 if (userInfo == null || StringUtils.isEmpty(userInfo.getUserId()) || StringUtils.isEmpty(userInfo.getUserName())) { 33 return null; 34 } 35 String token = Jwts.builder().setSubject(SUBJECT) 36 .claim("id", userInfo.getUserId()) 37 .claim("name", userInfo.getUserName()) 38 .setIssuedAt(new Date()) 39 .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) 40 .signWith(SignatureAlgorithm.HS256, APPSECRET).compact(); 41 42 return token; 43 } 44 45 46 /** 47 * 校验token 48 * 49 * @param token 50 * @return 51 */ 52 public static Claims checkJWT(String token) { 53 54 try { 55 final Claims claims = Jwts.parser().setSigningKey(APPSECRET). 56 parseClaimsJws(token).getBody(); 57 return claims; 58 59 } catch (Exception e) { 60 } 61 return null; 62 } 63}
4)测试
1package com.haitaiinc.clinicpathservice; 2 3import com.haitaiinc.clinicpathservice.entity.UserInfo; 4import com.haitaiinc.clinicpathservice.utils.JwtUtils; 5import io.jsonwebtoken.Claims; 6import org.junit.jupiter.api.Test; 7 8public class CommonTest { 9 10 @Test 11 public void testGeneJwt() { 12 UserInfo user = new UserInfo(); 13 user.setUserId("admin"); 14 user.setUserName("管理员"); 15 16 String token = JwtUtils.geneJsonWebToken(user); 17 System.out.println(token); 18 19 } 20 21 22 @Test 23 public void testCheck() { 24 String token = "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlkIjoiYWRtaW4iLCJuYW1lIjoi566h55CG5ZGYIiwiaWF0IjoxNTc3NTU3MDU1LCJleHAiOjE1NzgxNjE4NTV9.VrrKtCTnxVN76JhpyIusCGq9Wj89wLor0OqIJ6s0zXo"; 25 Claims claims = JwtUtils.checkJWT(token); 26 if (claims != null) { 27 String id = (String) claims.get("id"); 28 String name = (String) claims.get("name"); 29 System.out.println(id); 30 System.out.println(name); 31 } else { 32 System.out.println("非法token"); 33 } 34 } 35}