首页> 文章> 详情

ThreadLocal 串数据 spring boot 拦截器【已解决】

教程分享 > Java教程 (160) 2024-07-09 10:37:22

 

导致原因

 

ThreadLocal 使用后未及时释放

bbadaaa4f83442b1812b3b01032a1c86

 

解决办法

 

写一个类继承 ServletRequestListener ,配置@WebListener注解:【已测试】

@WebListener
public class RequestListener implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        /**
         * 清空ThreadLocal,避免线程池中线程复用导致ThreadLocal被串用.
         * 因此,request请求完毕就要销毁ThreadLocal。
         */
        OperatorHolder.clearOperator();
    }
    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
    }
}

在springboot启动类增加如下@ServletComponentScan注解,以此来启用监听组件

//参数指定listener路径
@ServletComponentScan("com.your.package.to.listener")
//...其他注解忽略
public class Application{
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

 

另附:拦截器的afterCompletion方法里面释放应该也可以【未测试】

@Slf4j
@Component
public class SupplierAuthInterceptor implements HandlerInterceptor {

 @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    ...忽略部分....
    ...忽略部分....
    }

...忽略部分....

    @Override
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //完成后释放
        CurrentSupplierUser.clear();
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }

...忽略部分....

}

 

参考文章 ThreadLocal在线程池中被串用_threadlocal串数据-CSDN博客

参考文章是过滤器Filter,我这里的情况差不多,拦截器,也是没有释放ThreadLocal 导致请求频繁的时候串数据了。

https://www.leftso.com/article/2407021124184704.html

相关文章

参考文章 ThreadLocal在线程池中被串用_threadlocal串数据-CSDN博客流程示意参考文章是过滤器Filter,我这里的情况差不多,拦截器,也
Spring Boot中的拦截器和过滤器都是用于在请求到达控制器之前或之后对请求进行处理的。区别如下:拦截器是基于Java的反射机制,而过滤器是基于函数回调。拦截器只能对Spring MVC的请...
Java编程中spring boot项目动态添加拦截器Interceptor
学习创建和配置使用JSP 模板文件渲染视图层的Spring Boot jsp 视图解析器
mybatis Interceptor拦截器实现自定义扩展查询兼容mybatis plus @Intercepts({ @Signature(type = Executor.c...
使用Spring Batch decorators对数据进行分类以写入多个目的地。当您在企业架构中工作以将数据传递/共享到多个系统时,这是非常方便的。Spring批处理中的装饰器是什么2.1。什...
Spring Boot 1.x升级到Spring Boot 2.0迁移指南
Spring Boot 入门 AOP 日志处理,这里主要讲解spring boot 中采用AOP方式进行日志的统一处理。spring 框架的处理也是一样。综合来讲,本文主要讲解了spring b...
项目源码下载:(访问密码:9987)Spring-Cloud-Circuit-Breaker.zip学习在调用底层微服务的同时利用调用的Spring Cloud Netflix堆栈组件之一Hys...
Spring Boot 2.0,Spring框架的Spring Boot 中的Spring Boot Actuator变化讲解。并且了解如何在Spring Boot 2.0中使用Actuator...
Spring Security 配置多个Authentication Providers认证器
一、spring boot shiro 无状态token认证项目结构图​二、无状态spring boot shiro相关配置2.1shiro redis 缓存配置首先是实现shiro的cache...
引言    通过之前spring boot mybatis 整合的讲解: spring boot mybaties整合  (spring boot mybaties 整合 基于Java注解方式写...
Spring Boot 2.0 绑定properties属性资源文件 Spring Boot 2.0 读取properties配置文件值 Spring Boot 2.0获取properties配...