【Java那些事】关于如何使用Jwt令牌的那些事

先简单介绍一下吧 ^_~

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用间传递声明的一种基于JSON的轻量级的令牌。

JWT令牌由三部分组成:头部(Header)、载荷(Payload)、签名(Signature)。头部通常包含令牌的类型和使用的加密算法;载荷包含声明(claims),如用户信息、权限等;签名是对头部和载荷的签名,用于验证令牌的真实性和完整性。

JWT令牌的特点包括:

  1. 跨平台:JWT是基于JSON的标准,适用于不同平台和语言。
  2. 自包含:JWT令牌包含了所有用户信息和声明,避免了需要在服务器存储会话信息。
  3. 可验证性:使用签名对JWT进行验证,确保令牌的真实性和完整性。
  4. 非状态性:JWT令牌在服务器端不需要存储状态信息,降低了服务器的负担。

总的来说,JWT令牌提供了一种安全、轻量级的身份验证和授权机制,广泛应用于Web开发中的用户认证和授权过程中。

先创建一个JwtUtil 工具类,来制作Jwt令牌

public class JwtUtil {
    private static final String KEY = "Java"; //自定义KEY
    //获得令牌 token
    public static String getToken(Map<String, Object> claims){
        return JWT.create()
                .withClaim("claims", claims)
                .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))
                .sign(Algorithm.HMAC256(KEY));
    }
    //转换token令牌
    public static Map<String, Object> parseToken(String token) {
        return JWT.require(Algorithm.HMAC256(KEY))
                .build()
                .verify(token)
                .getClaim("claims")
                .asMap();
    }

}

在 实现用户登录方法 的时候生成令牌

 @PostMapping("/login")
    public Result<String> login(String username, String password){
        String pwd = Md5Util.getMD5String(password);
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUsername, username);
        User user = userService.getOne(queryWrapper);
        if(user == null){
            return Result.error("该用户不存在");
        }else {
            HashMap<String, Object> claims = new HashMap<>();
            claims.put("id", user.getId());
            claims.put("username", user.getUsername());
            String token = JwtUtil.getToken(claims);
            return Result.success(token);
        }
    }

 生成的令牌有什么用呢???【应用于Web开发中的用户认证和授权过程中】

在拦截器这里就能发挥它的作用啦<(* ̄▽ ̄*)/

@Component
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //令牌验证
        String token = request.getHeader("Authorization");
        try {
            Map<String, Object> claims = JwtUtil.parseToken(token);
            //把业务数据存储到ThreadLocal
            ThreadLocalUtil.set(claims);
            return true;
        }catch (Exception e){
            response.setStatus(401);
            return false;
        }

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //清空数据
        ThreadLocalUtil.remove();
    }
}

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值