JWT笔记
java web token
,通过加密,存储一些用户信息以及过期时间,便于登录以及解决session
+cookie
的局限
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>
创建token
public static String createToken(Long userId, String userName) {
String token = Jwts.builder()
// 1、主题,不是你最需要的信息
.setSubject("SYT-USER")
// 2、过期时间
.setExpiration(new Date(1664002752263l + tokenExpiration))
// 3、声明一些你需要的信息
// 3.1、userId
.claim("userId", userId)
// 3.2、用户名
.claim("userName", userName)
// 4、签名以及签名的加密算法,相当于这个签名你是用中文签还是英文签,解密信息要用到这个签名
.signWith(SignatureAlgorithm.HS512, tokenSignKey)
// 5、对jwt进行压缩,但是不见得一定会比不压缩短,至少我试的没有
.compressWith(CompressionCodecs.GZIP)
// 6、压缩,上面的信息拼起来
.compact();
return token;
}
解析token
@Test
public void testCreateJwt() {
// 根据用户信息创建jwt
String token = TestCommon.createToken(1001l, "xiaoming");
System.out.println(token);
// 加密有签名,解密也要有
// 获取声明的信息,这里解析jwt发现过期,会熬抛出异常
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
// 1、userId
String userId = claimsJws.getBody().get("userId").toString();
// 2、用户名
String userName = claimsJws.getBody().get("userName").toString();
// 3、过期时间
Date expiration = claimsJws.getBody().getExpiration();
log.info("userId:{},userName:{},expiration:{}", userId, userName, expiration);
}
在解析jwt的时候发现过期,会抛出异常
建议全局异常处理掉,用HttpStatus
里的枚举信息401
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ExpiredJwtException.class)
public Result handleExpiredJwt() {
return Result.fail(HttpStatus.UNAUTHORIZED.value(),
HttpStatus.UNAUTHORIZED.getReasonPhrase());
}
}
jwt工具
public class JwtUtil {
/**
* 过期时间,毫秒
*/
private static long tokenExpiration = 24 * 60 * 60 * 1000;
/**
* 签名秘钥,随便你怎么写
*/
private static String tokenSignKey = "123asd1211cc2";
/**
* 根据参数生成token
*
* @param userId
* @param userName
* @return
*/
public static String createToken(Long userId, String userName) {
String token = Jwts.builder()
.setSubject("SYT-USER")
.setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
.claim("userId", userId)
.claim("userName", userName)
.signWith(SignatureAlgorithm.HS512, tokenSignKey)
.compressWith(CompressionCodecs.GZIP)
.compact();
return token;
}
/**
* 根据token字符串得到用户id
*
* @param token
* @return
*/
public static Long getUserId(String token) {
if (StringUtils.isEmpty(token)) {
return null;
}
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
Integer userId = (Integer) claims.get("userId");
return userId.longValue();
}
/**
* 根据token字符串得到用户名称
*
* @param token
* @return
*/
public static String getUserName(String token) {
if (StringUtils.isEmpty(token)) {
return "";
}
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
Claims claims = claimsJws.getBody();
return (String) claims.get("userName");
}
}