拦截器中使用threadLocal.set值后在controller中获取为null
时间: 2024-05-14 10:19:08 浏览: 130
在拦截器中使用 `ThreadLocal` 存储数据时,需要注意以下几点:
1. `ThreadLocal` 的作用域是线程级别的,即同一个线程中的所有代码都可以访问该 `ThreadLocal` 对象存储的数据,但不同线程之间是互不干扰的。
2. 在拦截器中,如果使用 `ThreadLocal` 存储数据,需要在请求处理结束后将其清空,否则该线程在下一次请求时可能会访问到上一次请求中存储的数据。
3. 在控制器中访问 `ThreadLocal` 存储的数据时,需要确保在同一个线程中,否则会出现获取到 `null` 的情况。
以下是一个示例代码:
```java
public class MyInterceptor implements HandlerInterceptor {
private static final ThreadLocal<String> threadLocal = new ThreadLocal<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String value = // 获取需要存储的数据
threadLocal.set(value);
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
threadLocal.remove(); // 清空 ThreadLocal 中的数据
}
}
@RestController
public class MyController {
@GetMapping("/test")
public String test() {
String value = MyInterceptor.threadLocal.get();
return "value: " + value;
}
}
```
在上面的代码中,`MyInterceptor` 中使用 `ThreadLocal` 存储数据,`MyController` 中通过访问 `MyInterceptor.threadLocal` 获取存储的数据。请注意,`MyInterceptor.threadLocal` 是一个静态变量,因此在不同的线程中访问到的是不同的 `ThreadLocal` 对象。如果在 `MyController` 中访问时获取到的是 `null`,那么很可能是因为在不同的线程中访问了 `ThreadLocal` 对象。
阅读全文