Java自定义过滤器和拦截器实现ThreadLocal线程封闭(java,threadlocal,开发技术)

时间:2024-05-05 12:12:55 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

本文小编为大家详细介绍“Java自定义过滤器和拦截器实现ThreadLocal线程封闭”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java自定义过滤器和拦截器实现ThreadLocal线程封闭”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

线程封闭

线程封闭一般通过以下三个方法:

  • Ad-hoc线程封闭:程序控制实现,最糟糕,忽略

  • 堆栈封闭:局部变量,无并发问题

  • ThreadLocal线程封闭:特别好的封闭方法

方法2是最常用的,变量定义在接口内,本文主要讲解方法三,SpringBoot项目通过自定义过滤器和拦截器实现ThreadLocal线程封闭。实现Filter接口自定义过滤器和继承HandlerInterceptorAdapter自定义拦截器。

ThreadLocal线程封闭实现步骤

封装ThredLocal的方法

/***<p>自定义RequestHolder</p></p>**@Authorzjq*@Date2021/12*/publicclassRequestHolder{privatefinalstaticThreadLocal<Long>requestHolder=newThreadLocal<>();publicstaticvoidset(Longid){requestHolder.set(id);}publicstaticLongget(){returnrequestHolder.get();}publicstaticvoidremove(){requestHolder.remove();}}

自定义过滤器

自定义定义拦截器继承Filter接口,实现ThredLocal.add()方法

/***<p>自定义过滤器</p>**@Authorzjq*@Date2021/12/7*/@Slf4jpublicclassHttpFilterimplementsFilter{/***为Filter初始化提供支持**@paramfilterConfig*@throwsServletException*/@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{}/***拦截到要执行的请求时,doFilter就会执行。这里我们可以写对请求和响应的预处理。*FilterChain把请求和响应传递给下一个Filter处理**@paramservletRequest*@paramservletResponse*@paramfilterChain*@throwsIOException*@throwsServletException*/@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{//把普通servlet强转成httpServletHttpServletRequesthttpServletRequest=(HttpServletRequest)servletRequest;LongthreadId=Thread.currentThread().getId();log.info("dofilter,threadId:{}servletPath:{}",threadId,httpServletRequest.getServletPath());//把当前线程id放入requestHolderRequestHolder.set(threadId);//放行filterChain.doFilter(httpServletRequest,servletResponse);}/***Filter实例销毁前的准备工作*/@Overridepublicvoiddestroy(){}}

自定义拦截器

自定义拦截器在线程使用完毕后移除ThredLocal中内容,避免内存溢出

/***<p>自定义拦截器</p>**@Authorzjq*@Date2021/12/7*/@Slf4jpublicclassHttpInterceptorextendsHandlerInterceptorAdapter{/***拦截处理程序的执行。在HandlerMapping确定合适的处理程序对象之后,在HandlerAdapter调用处理程序之前调用。*@paramrequest*@paramresponse*@paramhandler*@return*@throwsException*/@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{log.info("preHandle执行。。。");returntrue;}/***请求处理完成后(渲染视图后)的回调。将在处理程序执行的任何结果上调用,从而允许进行适当的资源清理。*@paramrequest*@paramresponse*@paramhandler*@paramex*@throwsException*/@OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{RequestHolder.remove();log.info("afterCompletion执行。。。");return;}}

Application类启动类中配置自定义过滤器和拦截器

/****@authorzjq*/@SpringBootApplicationpublicclassApplicationextendsWebMvcConfigurationSupport{publicstaticvoidmain(String[]args){SpringApplication.run(ConcurrencyApplication.class,args);}/***自定义过滤器*@return*/@BeanpublicFilterRegistrationBeanfilterRegistrationBean(){FilterRegistrationBeanfilterRegistrationBean=newFilterRegistrationBean();filterRegistrationBean.setFilter(newHttpFilter());//设置自定义过滤器拦截的urlfilterRegistrationBean.addUrlPatterns("/threadLocal/*");returnfilterRegistrationBean;}/***定义自定义拦截器原先需要继承WebMvcConfigurerAdapter*SpringBoot2.0后WebMvcConfigurerAdapter被定义成过时了,推荐使用继承WebMvcConfigurationSupport*@paramregistry*/@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(newHttpInterceptor()).addPathPatterns("/**");}}

定义调用接口

/***ThreadLocal测试controller*@authorzjq*/@Controller@RequestMapping("/threadLocal")publicclassThreadLocalController{@RequestMapping("/test")@ResponseBodypublicLongtest(){returnRequestHolder.get();}}

请求访问验证

访问调用接口http://localhost:8080/threadLocal/test,控制台输出如下:

Java自定义过滤器和拦截器实现ThreadLocal线程封闭

读到这里,这篇“Java自定义过滤器和拦截器实现ThreadLocal线程封闭”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

本文:Java自定义过滤器和拦截器实现ThreadLocal线程封闭的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:HTML内联标签iframe如何使用下一篇:

18 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18