先简单介绍一下吧 ^_~
JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用间传递声明的一种基于JSON的轻量级的令牌。
JWT令牌由三部分组成:头部(Header)、载荷(Payload)、签名(Signature)。头部通常包含令牌的类型和使用的加密算法;载荷包含声明(claims),如用户信息、权限等;签名是对头部和载荷的签名,用于验证令牌的真实性和完整性。
JWT令牌的特点包括:
- 跨平台:JWT是基于JSON的标准,适用于不同平台和语言。
- 自包含:JWT令牌包含了所有用户信息和声明,避免了需要在服务器存储会话信息。
- 可验证性:使用签名对JWT进行验证,确保令牌的真实性和完整性。
- 非状态性: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();
}
}