threadlocal配合HandlerInterceptor使用
时间: 2023-11-03 15:22:07 浏览: 90
ThreadLocal 是一个用于保存线程私有变量的工具类。它可以在多线程环境下保证每个线程都拥有自己的变量副本,避免了线程安全问题。
在使用 HandlerInterceptor 进行请求拦截时,可以将需要在整个请求处理过程中共享的数据保存在 ThreadLocal 中。这样,在同一线程中处理请求的各个组件(如拦截器、控制器、服务等)都可以访问到该数据,而不需要显式地传递参数。
以下是一个使用 ThreadLocal 配合 HandlerInterceptor 的示例:
```java
public class MyInterceptor implements HandlerInterceptor {
private static final ThreadLocal<Object> threadLocal = new ThreadLocal<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在 preHandle 阶段将需要共享的数据保存到 ThreadLocal 中
threadLocal.set("sharedData");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在 postHandle 阶段获取 ThreadLocal 中的数据
Object sharedData = threadLocal.get();
// 处理逻辑 ...
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 请求处理完成后,清除 ThreadLocal 中的数据,避免内存泄漏
threadLocal.remove();
}
}
```
在上述示例中,preHandle 阶段将共享的数据保存到 ThreadLocal 中,postHandle 阶段从 ThreadLocal 中获取数据进行处理,afterCompletion 阶段清除 ThreadLocal 中的数据。
需要注意的是,ThreadLocal 在使用完毕后,需要手动调用其 remove() 方法进行清除,以防止线程重用时的数据污染。
阅读全文