专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

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

中国探月工程总设计师吴伟仁今年将全面推进探月工程四期作为距离地球最近的天体,月球是人类开启星际时代的第一站。今年,中国将全面推进探月工程四期,规划包括嫦娥六号嫦娥七号和嫦娥八号任务。中国探月工程总设计师吴伟仁介绍,嫦娥六号将从月球背游泳奥运冠军入美国籍,回中国创业发财,被誉为是最完美游泳身材游泳这个项目深受大家的关注和喜爱,原因就是这项运动是力量与美的结合。游泳也算是我们的传统优势项目,因为不断有优秀的运动员涌现,为中国游泳攻城拔寨,贡献力量,塑造辉煌。今天要说的这位盘点深圳女冰2022大事记,代表中国队冬奥展风采2022年是中国冰球发展的重要年份,国家队在北京2022年冬奥会展现了风采在世锦赛上实现了升组深圳获得2023年女子冰球世锦赛承办权中国俱乐部再次夺得俄罗斯女子冰球联赛冠军等等。而广州番禺以祈福亚运城为代表的大睡城,而今高攀不起番禺概况番禺区是广东省广州市市辖区,位于广州市中南部,地处粤港澳大湾区地理中心,毗邻港澳,北与广州市海珠区相接,东临狮子洋,与东莞市相望,西与佛山市南海区和顺德区相邻,南滨珠江口,世界历史著名的十大帝国,你知道有哪些吗?中国历朝仅有它们要想了解历史上的十大帝国,就得先知道帝国的定义是什么?帝国的广义解释是指区域性的实现统治的国家,具有辽阔的疆域和众多的藩属国,或者国力极度强盛的国家。1。大英帝国大英帝国又被称为第中国全称是中华人民共和国,那日本全称是啥?几乎没人知道国家名称不仅代表着每个人的归宿,更是民族自豪感的象征。从一个国家的名称中我们可以显而易见的看出其国家性质,我国的全称是中华人民共和国,这是先辈们浴血拼搏为我们争取而来的。从名字上就风向变了?美科技巨头纷纷表态,外媒中国不愿意买了2月财经新势力互联网的发展让全球成为了一个整体,加上全球化的推展,出现了许多跨国企业,并且也不断突破公司上限,全球诞生了许多可以富可敌国的企业巨头。不过这些巨头企业因全球贸易而成功惠州市人大代表郑东涛进一步加大对传统中小微企业支持力度点击查看专题报道2022年,惠州累计为3584家中小微企业减少贷款成本1。1亿元高新技术企业增至2850家,科技型中小企业增至2729家,增速均居珠三角第一如何进一步扶持中小微企业东莞篮球十大贡献人物易建联篮球是东莞城市生活的一部分编者按回望来时路,从籍籍无名到家喻户晓,东莞篮球向前跨越的每一步都与人息息相关。我们有最敢为人先的创始人,他们身处商海却心系球坛,夯实篮球人才培养的土壤,让一城双冠的美谈名扬四海我三菱电机全热交换器新风系统全热交换器设备是一款主要用来改善与提高空调房间内空气品质的通风换气产品,主要配合空调使用,实现空调房间内品质污浊空气的排出,室外新鲜空气的换入功能,同时实现5060污浊排气能量的回卷上天!一加发布会所有新品价格汇总友商压力来了手机中国新闻2月7日,手机中国注意到,一加官方举办了新品发布会,带来了一加Ace2一加BudsAce一加27W冰点散热背夹等多款新品。这些产品中,有不少都采用了全新技术全新设计,在
全新欧蓝德成都车展公布配置,携手阿根廷国家足球队威风启程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岁,这是高中毕业的第九年,大学毕业的第五年,一切都和原来不一样了。看着镜子里一事无成又满脸沧桑的自己,突然就觉得好崩溃。曾经年少轻狂,不把一切放在眼里,觉得靠着自己的努
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网