// 秘钥
private static final String jwtToken = "123456Mszlu!@#$$";
public static String genToken(Map<String,Object> claims){
// = new HashMap<>();
// claims.put("userId",userId);
JwtBuilder jwtBuilder = Jwts.builder()
.signWith(SignatureAlgorithm.HS256, jwtToken) // 签发算法,秘钥为jwtToken
.setClaims(claims) // body数据,要唯一,自行设置
.setIssuedAt(new Date()) // 设置签发时间
.setExpiration(new Date(System.currentTimeMillis() + 24 * 60 * 60 * 60 * 1000));// 一天的有效时间
String token = jwtBuilder.compact();
return token;
}
// 解析token
public static Map<String, Object> parseToken(String token){
try {
Jwt parse = Jwts.parser().setSigningKey(jwtToken).parse(token);
return (Map<String, Object>) parse.getBody();
}catch (Exception e){
e.printStackTrace();
}
return null;
}
//测试生成token
public static void main(String[] args) {
Map<String,Object> claims = new HashMap<>();
claims.put("userId",1);
String token = genToken(claims);
System.out.println(parseToken(token));
System.out.println(token);
}
- 编写登录拦截器进行token拦截(interceptors)
@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);
//把业务数据存储到TheadLocal中
ThreadLocalUtil.set(claims);
System.out.println("2");
return true;
}catch(Exception e) {
response.setStatus(401);
System.out.println("1");
return false;
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//清空TheadLocal中的数据
ThreadLocalUtil.remove();
}
}
- 编写ThreadLocal存储业务数据,使用可以直接调用
/**
* ThreadLocal 工具类
*/
@SuppressWarnings("all")
public class ThreadLocalUtil {
//提供ThreadLocal对象,
private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();
//根据键获取值
public static <T> T get(){
return (T) THREAD_LOCAL.get();
}
//存储键值对
public static void set(Object value){
THREAD_LOCAL.set(value);
}
//清除ThreadLocal 防止内存泄漏
public static void remove(){
THREAD_LOCAL.remove();
}
}