过滤器(Filter)和拦截器(Interceptor)的执行顺序和区别kuotian

首先建立一个SpringBoot工程,增加一个IndexController供测试使用。

@ControllerpublicclassIndexController{@GetMapping("/hello")@ResponseBodypublicStringindex(){return"hello";}}过滤器Filter过滤器(Filter),是JavaEE的标准,依赖于Servlet容器,使用的时候是配置在SpringMVC框架中是配置在web.xml文件中的,可以配置多个,执行的顺序是根据配置顺序从上到下。在SpringBoot项目中也可以采用注解的形式实现。

Filter可以认为是Servlet的一种“加强版”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链。Filter也可以对用户请求生成响应,这一点与Servlet相同,但实际上很少会使用Filter向用户请求生成响应。使用Filter完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

创建Filter必须实现javax.servlet.Filter接口,在该接口中定义了如下三个方法。

用这种方式配置TestFilter1、TestFilter2

@WebFilter(urlPatterns="/hello")@Order(4)//预期order值越小,过滤器越靠前,此处配置无效publicclassTestFilter1implementsFilter{@Overridepublicvoidinit(javax.servlet.FilterConfigfilterConfig)throwsServletException{System.out.println("##############Filter1init##############");}@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{//在DispatcherServlet之前执行System.out.println("##############doFilter1before##############");filterChain.doFilter(servletRequest,servletResponse);//在视图页面返回给客户端之前执行,但是执行顺序在Interceptor之后System.out.println("##############doFilter1after##############");}@Overridepublicvoiddestroy(){System.out.println("##############Filter1destroy##############");}}并且在启动类添加@ServletComponentScan

@SpringBootApplication@ServletComponentScanpublicclassTestbootApplication{publicstaticvoidmain(String[]args){SpringApplication.run(TestbootApplication.class,args);}}2.通过@Bean来配置用这种方式配置TestFilter3、TestFilter4

创建过滤器。

@ComponentpublicclassTestFilter3implementsFilter{@Overridepublicvoidinit(javax.servlet.FilterConfigfilterConfig)throwsServletException{System.out.println("##############Filter3init##############");}@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{//在DispatcherServlet之前执行System.out.println("##############doFilter3before##############");filterChain.doFilter(servletRequest,servletResponse);//在视图页面返回给客户端之前执行,但是执行顺序在Interceptor之后System.out.println("##############doFilter3after##############");}@Overridepublicvoiddestroy(){System.out.println("##############Filter3destroy##############");}}注册过滤器

@ConfigurationpublicclassFilterConfig{@BeanpublicFilterRegistrationBeantestFilter3RegistrationBean(){FilterRegistrationBeanregistration=newFilterRegistrationBean(newTestFilter3());registration.addUrlPatterns("/hello");registration.setOrder(1);//值越小越靠前,此处配置有效returnregistration;}@BeanpublicFilterRegistrationBeantestFilter4RegistrationBean(){FilterRegistrationBeanregistration=newFilterRegistrationBean(newTestFilter4());registration.addUrlPatterns("/hello");registration.setOrder(2);returnregistration;}}3.SpringMVC在web.xml配置创建一个Filter只需两个步骤

示例:

CharacterEncodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8forceEncodingtrueCharacterEncodingFilter/*过滤器启动测试不使用order结果:

##############Filter4init############################Filter3init############################Filter2init############################Filter1init############################doFilter3before############################doFilter4before############################doFilter1before############################doFilter2before############################doFilter2after############################doFilter1after############################doFilter4after############################doFilter3after##############配置order,值越小越靠前

##############Filter4init############################Filter3init############################Filter2init############################Filter1init############################doFilter4before############################doFilter3before############################doFilter1before############################doFilter2before############################doFilter2after############################doFilter1after############################doFilter3after############################doFilter4after##############由此可见,@Order的顺序配置没有起作用,registration.setOrder()是有效的。

拦截器(Interceptor)不依赖Servlet容器,依赖Spring等Web框架,在SpringMVC框架中是配置在SpringMVC的配置文件中,在SpringBoot项目中也可以采用注解的形式实现。

拦截器是AOP的一种应用,底层采用Java的反射机制来实现的。与过滤器一个很大的区别是在拦截器中可以注入Spring的Bean,能够获取到各种需要的Service来处理业务逻辑,而过滤器则不行。

afterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle,Exceptionex)方法,该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。

interceptor的执行顺序大致为:

Spring中主要通过HandlerInterceptor接口来实现请求的拦截,实现HandlerInterceptor接口需要实现下面三个方法:

自定义一个拦截器实现HandlerInterceptor,实现preHandle,postHandle,afterCompletion三个方法。

@ComponentpublicclassTestInterceptor1implementsHandlerInterceptor{@OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println("##############TestInterceptor1preHandle##############");returntrue;}//在Controller之后的DispatcherServlet之后执行@OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println("##############TestInterceptor1postHandle##############");}//在页面渲染完成之后返回给客户端执行@OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println("##############TestInterceptor1afterCompletion##############");}}2.注册拦截器自定义拦截器配置类继承自WebMvcConfigurer,重写addInterceptors将自定义的拦截器添加至注册中心。

@ComponentpublicclassWebMvcConfigimplementsWebMvcConfigurer{@AutowiredprivateTestInterceptor1testInterceptor1;@AutowiredprivateTestInterceptor2testInterceptor2;@OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(testInterceptor1).excludePathPatterns("/**/*.css","/**/*.js","/**/*.png","/**/*.jpg","/**/*.jpeg").addPathPatterns("/hello");registry.addInterceptor(testInterceptor2).addPathPatterns("/hello");}}注册顺序即为执行顺序。

过滤器拦截器启动测试执行顺序如下。

Spring的Interceptor(拦截器)与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:

THE END
1.Java面试题022. 什么叫过滤器(filter)? 答:就是对servlet请求起到过滤的作用,它在监听器之后,作用在servlet之前。比如编码过滤器,就是经过了该过滤器的请求都会设置成过滤器中指定的编码。过滤器是随web应用启动而启动,只初始化一次,只有当web应用停止或重新部署的时候才销毁。 https://developer.aliyun.com/article/925971
2.拦截器过滤器监听器各有什么作用?然后在编写自己的拦截器,web.xml文件中也需要配置 最后在需要拦截的方法上标上自定义注解,表示需要拦截这个方法。 2.未登录或者非vip的话,可以试看10分钟怎么解决 ? 将视频分段,前十分钟是一个请求,之后再次请求,拦截后边这个请求 3.拦截器与过滤器的区别 : (1)拦截器是基于java的反射机制的,而过滤器是基于函数回...http://lesson.jnshu.com/l/subjectContent/204/?id=&lobtn=2
3.JAVAWEB面试题汇总<filter-mapping><filter-name></filter-name> <url-pattern></url-pattern >(<servlet-name></servlet-name>)</filter-mapping > 如果有多个过滤器优先执行url-pattern,再执行servlet-name;如果有多个url-pattern按web.xml布署顺序执行。 60. 你在项目中的角色是什么,你是如何进行工作的? http://www.360doc.com/content/14/0603/18/16924560_383345578.shtml
1.RequestInterceptor配置执行顺序和filter执行顺序filter顾名思义就是过滤器,大家都知道配置过滤器是为了对一个请求进行预处理,然后交给servlet,filter再对响应后处理。filter就像漏斗,对能通过的放行,拦截不能通过的。那么如果有两个过滤器呢?执行顺序是怎么的? 百度百科上对filter的功能描述:它使用户可以改变一个request和修改一个response. Filter 不是一个servlet...https://blog.51cto.com/u_16099212/12627429
2.Javaweb开发核心知识之Filter过滤器文章浏览阅读267次,点赞3次,收藏4次。简介:讲解JavaWeb核?心知识之过滤器?Filter什么是过滤器?:(检验是否符合要求,或者 对内容做?二次处理理,设置编码响应等)Servlet?面的过滤器?作?Filter的生命周期。https://blog.csdn.net/weixin_67996964/article/details/143919983
3.django过滤器和自定义过滤器三、自定义过滤器 实现步骤 1、在子应用下创建python package命名为templatetag(固定的)2、在templatetag下创建python文件,命名myfilter.py(随意设置的)3、myfilter文件中增加过滤器逻辑处理函数4、模板页面顶部加载myfilter文件,{% load filter %}5、在模板页面应用自定义过滤器 举例:myfilter.py文件 from django....https://www.ctyun.cn/zhishi/p-424498
4.过滤器的使用及其实现原理-chain.doFilter(request,response);本行代码的作用: -执行下一个过滤器,如果下面没有过滤器,执行最终的Servlet。 -注:Filter的优先级自然高于Servlet。 -/a.do对应Filter,也对应Servlet。所以在执行Servlet之前,必须先执行Filter。 4.2Filter的配置路径:57 ...https://www.tulingxueyuan.cn/tlzx/jsp/3234.html
5.SpringBoot自定义过滤器的两种方式及过滤器执行顺序如下自定义过滤器 ReqResFilter 必须实现 javax.servlet.Filter。然后添加注解 @WebFilter(javax.servlet.annotation.WebFilter),urlPatterns 过滤器要过滤的URL规则配置,filterName 过滤器的名称。https://cloud.tencent.com/developer/article/1513212
6.JavaFilter过滤器的使用教程javaFilter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能https://www.jb51.net/article/272584.htm
7.2023前端面试题及答案整理(Vue)江阴雨辰互联destroyed:Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。 Vue 的父组件和子组件生命周期钩子执行顺序是什么 加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted ...https://www.yc00.com/news/1702142827a1180229.html
8.SpringCloud最全面试题整理,全是干货Filter在“pre”类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等, 在“post”类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。 核心逻辑:路由转发+执行过滤链 47、Spring Cloud GateWay网关配置的两种方式? yaml配置 server: port: 9527 spring: ...https://www.nowcoder.com/discuss/1044144
9.常见vue面试题20190614(版本在不断更新,以下的区别有可能不是很正确。我工作中只用到vue,对angular和react不怎么熟) 1.与AngularJS的区别 相同点: 都支持指令:内置指令和自定义指令;都支持过滤器:内置过滤器和自定义过滤器;都支持双向数据绑定;都不支持低端浏览器。 不同点: ...https://www.jianshu.com/p/74e2af5771be
10.HXD3B型电力机车在车体顶层由()个进气间组成,使得通过过滤器的进...刷刷题APP(shuashuati.com)是专业的大学生刷题搜题拍题答疑工具,刷刷题提供HXD3B型电力机车在车体顶层由()个进气间组成,使得通过过滤器的进风量尽量均匀。A.一B.二C.三D.四的答案解析,刷刷题为用户提供专业的考试题库练习。一分钟将考试题Word文档/Excel文档/PDF文档转https://www.shuashuati.com/ti/298ac2a6e9b74803a65e027967f5e96a.html?fm=bd95c9675c4c31e32bf63bcdb63d0d3705