1、工具类
import java.util.HashMap;
import java.util.Map;
public class ThreadLocalUtil {
// 使用Map存储多类型数据
private static final ThreadLocal<Map<String, Object>> CONTEXT_HOLDER = new ThreadLocal<>();
// 存储数据
public static void set(String key, Object value) {
Map<String, Object> map = CONTEXT_HOLDER.get();
if (map == null) {
map = new HashMap<>();
CONTEXT_HOLDER.set(map);
}
map.put(key, value);
}
// 获取数据
public static <T> T get(String key, Class<T> clazz) {
Map<String, Object> map = CONTEXT_HOLDER.get();
if (map == null) return null;
return clazz.cast(map.get(key));
}
// 清理数据
public static void remove() {
CONTEXT_HOLDER.remove();
}
}
2、请求结束后清除缓存,防止内存泄露
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class ThreadLocalInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
ThreadLocalUtil.remove(); // 请求结束清理数据
}
}
3、将拦截器添加到Spring Boot当中
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private ThreadLocalInterceptor threadLocalInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(threadLocalInterceptor);
}
}