SpringBoot过滤器拦截器监听器对比及使用场景
一、关系图理解
二、区别1。过滤器过滤器是在web应用启动的时候初始化一次,在web应用停止的时候销毁可以对请求的URL进行过滤,对敏感词过滤挡在拦截器的外层实现的是javax。servlet。Filter接口,是Servlet规范的一部分在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后依赖Web容器会多次执行1。1HttpServletRequestWrapper
在请求到达之前对request进行修改packagecom。dingwen。lir。filter;importlombok。extern。slf4j。Slf4j;importjavax。servlet。http。HttpServletRequest;importjavax。servlet。http。HttpServletRequestWrapper;importjava。util。Arrays;在请求到达之前对request进行修改authordingwenSlf4jpublicclassRequestWrapperextendsHttpServletRequestWrapper{publicRequestWrapper(HttpServletRequestrequest){super(request);log。info(RequestWrapper);}OverridepublicStringgetParameter(Stringname){可以对请求参数进行过滤returnsuper。getParameter(name);}OverridepublicString〔〕getParameterValues(Stringname){对请求参数值进行过滤String〔〕valuessuper。getRequest()。getParameterValues(name);returnsuper。getParameterValues(name);returntest。split();}}1。2OncePerRequestFilter
OncePerRequestFilter,顾名思义,它能够确保在一次请求中只通过一次filterpackagecom。dingwen。lir。filter;importlombok。extern。slf4j。Slf4j;importorg。springframework。web。filter。OncePerRequestFilter;importjavax。servlet。FilterChain;importjavax。servlet。ServletException;importjavax。servlet。http。HttpServletRequest;importjavax。servlet。http。HttpServletResponse;importjava。io。IOException;importjava。io。PrintWriter;importjava。util。Arrays;请求过滤器OncePerRequestFilter:OncePerRequestFilter,顾名思义,它能够确保在一次请求中只通过一次filter。大家常识上都认为,一次请求本来就只filter一次,为什么还要由此特别限定呢,往往我们的常识和实际的实现并不真的一样,经过一番资料的查阅,此方法是为了兼容不同的webcontainer,也就是说并不是所有的container都入我们期望的只过滤一次,servlet版本不同,执行过程也不同,因此,为了兼容各种不同运行环境和版本,默认filter继承OncePerRequestFilter是一个比较稳妥的选择。authordingwenSlf4jpublicclassRequestFilterextendsOncePerRequestFilter{Overridepublicvoiddestroy(){super。destroy();log。info(RequestFilterdestroy);}OncePerRequestFilter。doFilter方法中通过request。getAttribute判断当前过滤器是否已执行若未执行过,则调用doFilterInternal方法,交由其子类实现OverrideprotectedvoiddoFilterInternal(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,FilterChainfilterChain)throwsServletException,IOException{try{RequestWrapperrequestWrappernewRequestWrapper(httpServletRequest);filterChain。doFilter(requestWrapper,httpServletResponse);log。info(RequestFilter);log。info(Arrays。toString(requestWrapper。getParameterValues(name)));}catch(Exceptionexception){httpServletResponse。setCharacterEncoding(utf8);httpServletResponse。setContentType(applicationjson;charsetutf8);PrintWriterwriterhttpServletResponse。getWriter();writer。write(exception。toString());}}}1。3配置packagecom。dingwen。lir。configuration;importcom。dingwen。lir。filter。RequestFilter;importcom。dingwen。lir。filter。RequestWrapper;importorg。springframework。boot。web。servlet。FilterRegistrationBean;importorg。springframework。context。annotation。Bean;importorg。springframework。context。annotation。Configuration;importjavax。servlet。Filter;过滤器配置类authordingwenConfigurationpublicclassFilterConfig{BeanpublicRequestFilterrequestFilter(){returnnewRequestFilter();}BeanpublicFilterRegistrationBeanRequestFilterregistrationBean(){FilterRegistrationBeanRequestFilterregistrationBeannewFilterRegistrationBean();registrationBean。setFilter(requestFilter());registrationBean。addUrlPatterns(filter);registrationBean。setName(RequestFilter);过滤器的级别,值越小级别越高越先执行registrationBean。setOrder(1);returnregistrationBean;}}2。拦截器实现org。springframework。web。servlet。HandlerInterceptor接口,动态代理拦截器应用场景,性能分析,权限检查,日志记录是一个Spring组件,并由Spring容器管理,并不不依赖Tomcat等容器,是可以单独使用的。不仅能应用在web程序中,也可以用于Application、Swing等程序中是在请求进入servlet后,在进入Controller之前进行预处理的,Controller中渲染了对应的视图之后请求结束2。1登录拦截packagecom。dingwen。lir。interceptor;importcom。dingwen。lir。entity。User;importorg。springframework。stereotype。Component;importorg。springframework。util。ObjectUtils;importorg。springframework。web。servlet。HandlerInterceptor;importjavax。servlet。http。HttpServletRequest;importjavax。servlet。http。HttpServletResponse;importjava。io。IOException;登录拦截authordingwenComponentpublicclassPageInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{Useruser(User)request。getSession()。getAttribute(user);if(!ObjectUtils。isEmpty(user)){returntrue;}else{不管是转发还是重定向,必须返回false。否则出现多次提交响应的错误redirect(request,response);returnfalse;}}对于请求是ajax请求重定向问题的处理方法paramrequestparamresponsepublicvoidredirect(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{if(XMLHttpRequest。equals(request。getHeader(XRequestedWith))){ajax获取当前请求的路径response。setHeader(AccessControlExposeHeaders,REDIRECT,CONTENTPATH);告诉ajax我是重定向response。setHeader(REDIRECT,REDIRECT);告诉ajax我重定向的路径StringBufferurlrequest。getRequestURL();StringcontextPathrequest。getContextPath();response。setHeader(CONTENTPATH,url。replace(url。indexOf(contextPath)contextPath。length(),url。length(),)。toString());}else{httpresponse。sendRedirect(pagelogin);}response。getWriter()。write(403);response。setStatus(HttpServletResponse。SCFORBIDDEN);}}2。2配置packagecom。dingwen。lir。configuration;importcom。dingwen。lir。interceptor。PageInterceptor;importorg。springframework。context。annotation。Configuration;importorg。springframework。web。servlet。config。annotation。InterceptorRegistry;importorg。springframework。web。servlet。config。annotation。ResourceHandlerRegistry;importorg。springframework。web。servlet。config。annotation。ViewControllerRegistry;importorg。springframework。web。servlet。config。annotation。WebMvcConfigurer;mvc控制器配置MyWebMvcConfigurer:Springboot2。x以后版本使用authordingwenConfigurationpublicclassMyWebMvcConfigurerimplementsWebMvcConfigurer{拦截器依赖于Spring容器,此处拦截了所有,需要对静态资源进行放行OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){拦截器默认的执行顺序,就是它的注册顺序,也可以通过Order手动设置控制,值越小越先执行。registry。addInterceptor(newPageInterceptor())。addPathPatterns()。order()registry。addInterceptor(newPageInterceptor())。addPathPatterns()。excludePathPatterns(pagelogin,userlogin,pageajax,static);}不要要写控制器即可完成页面跳转访问paramregistryOverridepublicvoidaddViewControllers(ViewControllerRegistryregistry){registry。addViewController(pageajax)。setViewName(ajax);}自定义静态资源映射SpringBoot默认为我们提供了静态资源映射:classpath:METAINFresourcesclasspath:resourcesclasspath:staticclasspath:public优先级:METAINFresourcesresourcesstaticpublicparamregistryOverridepublicvoidaddResourceHandlers(ResourceHandlerRegistryregistry){registry。addResourceHandler(static)。addResourceLocations(classpath:static);registry。addResourceHandler(static)。addResourceLocations(file:E:static);}}3。监听器
实现javax。servlet。ServletRequestListener,javax。servlet。http。HttpSessionListener,javax。servlet。ServletContextListener等等接口
主要用来监听对象的创建与销毁的发生,比如session的创建销毁,request的创建销毁,ServletContext创建销毁三、注意1。静态资源问题
SpringBoot2。x以后版本拦截器也会拦截静态资源,在配置拦截器是需要将姿态资源放行。拦截器依赖于Spring容器,此处拦截了所有,需要对静态资源进行放行OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry。addInterceptor(newPageInterceptor())。addPathPatterns()。excludePathPatterns(pagelogin,userlogin,pageajax,static);}
SpringBoot2。x自定义静态资源映射spring:mvc:staticpathpattern:static
默认目录classpath:METAINFresourcesclasspath:resourcesclasspath:staticclasspath:public
优先级:METAINFresourcesresourcesstaticpublic2。登录拦截ajax重定向
由于ajax是异步的,还在当前页面进行的局部请求。当拦截到登录请求时,即使重定向也无法生效。需采用服务端给地址由前端进行跳转。详细见登录拦截器代码。前端处理!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8titleAJAXtitleheadbodybuttonUSERbuttonbodyhtml四、测试
代码地址:
https:gitee。comdingwengiteefilterinterceptorstudy。git1。拦截器测试1。1启动项目访问首页
http:localhost:8080pageindex
由于没有登录,直接重定向到了登录页
1。2输入用户名密码完成登录,调转到用户页
此时在访问首页
1。2退出登录
成功退出后,访问为授权的页面也相对会被重定向到登录页
1。3ajax未授权访问测试
点击访问user,由于未登录,没有全权访问。在前端进行了页面跳转,转到了登录页。
2。过滤器测试
可以看到过滤器进行了相对应的处理,重写的getParameterValues()也生效了。配合使用HttpServletRequestWrapperOncePerRequestFilter实现了对request的修改。
原文链接:https:mp。weixin。qq。comstKZDqPuOWbqrDyBhVRwoA
全新欧蓝德成都车展公布配置,携手阿根廷国家足球队威风启程8月26日,成都国际汽车展览会迎来盛大开幕,备受瞩目的合资SUV新车广汽三菱品牌旗舰SUV全新欧蓝德,在本届车展上首次公布配置并宣布开启新车盲订活动,以威风外观质享空间动感驾控科技
甘肃武威马国荣被双开,曾与武威市委火书记上下级关系七年多8月25日,甘肃省纪委监委发布消息武威市政协原副主席马国荣严重违纪违法被双开。省纪委监委的通报称,经查,马国荣伪造证据,隐匿违纪违法所得,对抗组织审查调查瞒报房产,在组织函询时不如
拜登失算了,中国这回没客气自美国众议院议长佩洛西窜访台湾地区之后,中美关系就陷入极度紧张状态,但这种紧张最开始只是氛围上的,因为拜登政府,一开始至少在明面上是不支持佩洛西窜台的。但是,拜登失算了,随着佩洛西
基金定投53期胜利永远属于乐观者欢迎点赞关注欢迎大家来到我基金定投的53期,上周因为自己的一些原因没有写太多的东西,深感抱歉。这两周市场还是发生了很多事情,首先来回顾一下市场美股方面纳斯达克指数结束五连涨,开启了
省级党委书记对这样的干部,毫不犹豫地褒奖重用,能晋级的马上晋级,符合条件的尽快提拔对那些工作干得出色特别是在关键时刻重大任务面前豁得出来冲得上去的干部,毫不犹豫地褒奖重用,能晋级的马上晋级,符合条件的尽快提拔。现在我们有些地方问责泛化问题比较突出,一出事就问责干
书评薄雾无限by微风几许只恨自己没文化,一句卧槽走天下,我佩服作者脑洞五体投地,文笔剧情好的没话说。看完之后梳理了好久才理顺剧情。作者开头标语为了老婆我可以死1000次,这真的不是说说的。攻宋晴岚是个痞气
独家格力电器(000651。SZ)向河北格力断供一事有了新进展。第一财经记者8月27日留意到,格力电器在河北的新授权经销商珠海桓格数字科技有限公司(下称珠海桓格),股东方董事名单中均出
连拉14个涨停板!独立董事罕见出手无法保证公司半年报真实准确完整中国基金报记者南深独立董事赵保卿无法保证公司2022年半年度报告内容的真实准确完整!8月26日,曾经的建筑装饰行业龙头之一的ST奇信发布财报,却遭到独董投弃权票。原因是公司原实控人
河南2条怪鱼已无害化处理,围捕时攻击人,网上10元能买到?抓获了!河南汝州中央公园湖中的鳄雀鳝在涵洞中被擒了一共一雌一雄2条鳄雀鳝大的长90多公分重12公斤以上小的长70多公分重67公斤。土豆评抓获鳄雀鳝只是治标,源头治理才是根本,比如暗
扎堆格陵兰岛全球亿万富翁的采矿创富新征途地处北极圈的格陵兰岛,正成为全球亿万富豪的淘金新热土。近日,一支由30名地质学家地球物理学家组成的团队正驻扎在格陵兰岛西海岸勘探地,他们正在采集土壤样本使用带有信号发射器的无人机与
上帝与撒旦相视一笑,理想与现实背道而驰这一年,28岁,这是高中毕业的第九年,大学毕业的第五年,一切都和原来不一样了。看着镜子里一事无成又满脸沧桑的自己,突然就觉得好崩溃。曾经年少轻狂,不把一切放在眼里,觉得靠着自己的努