ThreadLocal
ThreadLocal 是一个 Map<Thread, Object> 这样的结果,利用ThreadLocal可以在同一个线程中共享数据。而 Spring 中,一次请求的执行,会经过拦截器、过滤器、最终到达Controller、接着业务处理层Service和数据持久层Dao,这些操作的执行都是在同一个线程中完成的。如果想要共享数据,如用户登录状态数据,就可以用ThreadLocal这个数据结构来完成。
项目中使用 拦截器
-
定义拦截器,需要实现 HandlerInterceptor 接口
public class CartInterceptor implements HandlerInterceptor { /** * 执行目标方法之前拦截 * @param request * @param response * @param handler * @return * @throws Exception */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } /** * 目标方法执行完成后,进行拦截 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } }
-
注册拦截器到 Spring 的容器中
@Configuration public class MallWebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 拦截所有请求 registry.addInterceptor(new CartInterceptor()).addPathPatterns("/**"); } }
ThreadLocal 结合 Spring Session
- 利用 Spring Session 可以解决子域 session 共享问题。只要不同的微服务,对于的父域名相同,那么利用Spring Session 就可以在不同的微服务之间,获取同一份 session 数据。参考 session共享
- 利用 ThreadLocal 在同一个线程之间可以共享数据。