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<>();//设置当前的用户idpublic static void setUser(Users user) { threadLocal.set(user); }//获取当前的用户idpublic static Users getUser() {return threadLocal.get();}}
第二步,在doFilter地方缓存用户id
//当前请求的用户idLong 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);
