ThreadLocal常用方法:
public void set(T value) 设置当前线程的线程局部变量的值
public T get() 获取当前线程所对应的线程局部变量的值
我们可以先在doFilter中,保存当前用户的id,后面需要用的地方,去获取这个id,
每一次http请求都会是一个独立的线程,而且java处理1次请求的相关操作都会在同一个线程上处理。所以前面设置局部变量,后面的操作可以使用。
第一步,创建一个工具类BaseContext
package com.tj.utils;
import com.tj.system.domain.Users;
/**
* 基于ThreadLocal封装工具类,用户保存和获取当前用户信息
*/
public class BaseContext {
private static ThreadLocal<Users> threadLocal = new ThreadLocal<>();
//设置当前的用户id
public static void setUser(Users user) { threadLocal.set(user); }
//获取当前的用户id
public static Users getUser() {
return threadLocal.get();
}
}
第二步,在doFilter地方缓存用户id
//当前请求的用户id
Long userId = Long.valueOf(decodedJWT.getClaim("id").asString());
//中文对应有个解码
String userName = URLDecoder.decode(decodedJWT.getClaim("userName").asString(), "UTF-8");
//当前线程上设置用户id,用户姓名,BaseContext是自己编写的类,注意一下
Users user = new Users();
user.setId(userId);
user.setUser_name(userName);
BaseContext.setUser(user);
log.info("token验证通过,threadLocal线程缓存用户信息为:{}", user);