ThreadLocal 配合 spring 拦截器 实现 数据 线程隔

ThreadLocal 是 Java 中的一个类,它提供了线程局部变量,使得每个线程都可以独立地维护自己的变量副本。这对于需要在多线程环境中保持状态的情况非常有用。在 Spring 框架中,ThreadLocal 可以与拦截器(Interceptor)结合使用,以实现在同一个线程中传递数据的目的。

下面是一个简单的示例,演示了如何在 Spring 拦截器中使用 ThreadLocal 保存和获取数据:

public class MyInterceptor implements HandlerInterceptor {

    private static final ThreadLocal<String> threadLocalData = new ThreadLocal<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在拦截器的preHandle方法中设置ThreadLocal数据
        threadLocalData.set("Data to be passed between interceptors and controllers");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 这里可以做一些处理,但是要注意在请求完成后清理ThreadLocal数据,防止内存泄漏
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 请求完成后清理ThreadLocal数据,防止内存泄漏
        threadLocalData.remove();
    }
}

在上述代码中,MyInterceptor 是一个实现了 HandlerInterceptor 接口的拦截器。在 preHandle 方法中,我们将需要传递的数据设置到 threadLocalData 中。在 afterCompletion 方法中,我们清理 threadLocalData,确保不会造成内存泄漏。

然后,你可以在控制器(Controller)中获取 threadLocalData 中的数据,因为它在同一个线程中是共享的:

@RestController
public class MyController {

    @GetMapping("/getData")
    public String getData() {
        // 从ThreadLocal中获取数据
        String data = MyInterceptor.threadLocalData.get();
        return "Data from ThreadLocal: " + data;
    }
}

这样,通过 ThreadLocal,你可以在拦截器和控制器之间传递数据,确保在同一个线程中共享信息。但请注意,要小心在适当的时候清理 ThreadLocal,以避免潜在的内存泄漏问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值