Java自定义过滤器和拦截器实现ThreadLocal线程封闭
导读:本文共2934字符,通常情况下阅读需要10分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 本文小编为大家详细介绍“Java自定义过滤器和拦截器实现ThreadLocal线程封闭”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java自定义过滤器和拦截器实现ThreadLocal线程封闭”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。线程封闭线程封闭... ...
目录
(为您整理了一些要点),点击可以直达。
本文小编为大家详细介绍“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线程封闭的详细内容,希望对您有所帮助,信息来源于网络。