jwt笔记

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");
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值