先简单介绍一下吧 ^_~
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用间传递声明的一种基于JSON的轻量级的令牌。
JWT令牌由三部分组成:头部(Header)、载荷(Payload)、签名(Signature)。头部通常包含令牌的类型和使用的加密算法;载荷包含声明(claims),如用户信息、权限等;签名是对头部和载荷的签名,用于验证令牌的真实性和完整性。
JWT令牌的特点包括:
- 跨平台:JWT是基于JSON的标准,适用于不同平台和语言。
- 自包含:JWT令牌包含了所有用户信息和声明,避免了需要在服务器存储会话信息。
- 可验证性:使用签名对JWT进行验证,确保令牌的真实性和完整性。
- 非状态性:JWT令牌在服务器端不需要存储状态信息,降低了服务器的负担。
总的来说,JWT令牌提供了一种安全、轻量级的身份验证和授权机制,广泛应用于Web开发中的用户认证和授权过程中。
先创建一个JwtUtil 工具类,来制作Jwt令牌
java">public class JwtUtil {private static final String KEY = "Java"; //自定义KEY//获得令牌 tokenpublic 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();}}
在 实现用户登录方法 的时候生成令牌
java"> @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开发中的用户认证和授权过程中】
在拦截器这里就能发挥它的作用啦<(* ̄▽ ̄*)/
java">@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//令牌验证String token = request.getHeader("Authorization");try {Map<String, Object> claims = JwtUtil.parseToken(token);//把业务数据存储到ThreadLocalThreadLocalUtil.set(claims);return true;}catch (Exception e){response.setStatus(401);return false;}}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {//清空数据ThreadLocalUtil.remove();}
}