Spring Interceptor Filter 拦截器和过滤器

一、结论

拦截器(Interceptor)和过滤器(Filter)的区别:

①拦截器是基于java的反射机制的,而过滤器是基于函数回调。

②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

拦截器(Interceptor)可以获取ioc中的service bean实现业务逻辑

二、触发时机

有个专业词语叫触发时机

  1. 过滤器(Filter)和拦截器(Interceptor)触发时机不一样:

    过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

总结:过滤器包裹住servlet,servlet包裹住拦截器。

  1. 过滤器的触发时机是容器后,servlet之前,所以过滤器的doFilter(ServletRequest request, ServletResponse response, FilterChain chain)的入参是ServletRequest ,而不是HttpServletRequest。因为过滤器是在HttpServletRequest之前。
  2. 过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。
  3. 拦截器(Interceptor)是被包裹在过滤器之中的。
    5. SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。
  4. 拦截器是spring容器的,是spring支持的,

三、画图说明

graph TD;
A[Filter] -->|处理请求| B[tomcat];
B -->|调用拦截器链| C[Interceptor];
C -->|调用servlet| D[servlet];
D -->|调用controller| E[controller];

在Tomcat中,当请求到达服务器后,首先会经过过滤器(Filter)。Filter可以对请求进行预处理和过滤,比如身份认证、日志记录、字符编码等。而Servlet是基于Java编写的Web应用程序,是在请求经过过滤器后,由Tomcat调用Servlet容器进行处理。Controller是MVC框架中的一部分,它主要负责接收请求并根据请求的类型和参数调用相应的业务逻辑进行处理。拦截器(Interceptor)则是在Servlet容器处理请求之前或之后对请求进行处理,比如权限控制、日志记录、性能监控等。

因此,Filter需要在Servlet容器之前进行过滤处理,拦截器可以在Servlet容器之前或之后进行拦截处理。这样,可以保证请求在经过Filter和Interceptor进行预处理和过滤之后再交由Servlet进行业务逻辑处理。

请求会先到达Tomcat服务器。但是在请求到达Servlet之前,会经过一系列的Filter和Interceptor,这些组件可以对请求进行预处理、过滤、验证等操作,然后再将请求交给Servlet进行处理。因此,Filter和Interceptor是在Tomcat之前起作用的。

请求 -----------> 过滤器(Filter) -----------> 拦截器(Interceptor) -----------> Tomcat -----------> Servlet -----------> Controller

请求会先经过Filter,Filter会对请求进行过滤,比如判断是否符合某些条件,然后才会进入到Tomcat,Tomcat会将请求分发到对应的Servlet,Servlet会对请求进行处理并生成响应,最终响应会被返回到Controller中进行处理。在这个过程中,Interceptor可以对请求和响应进行拦截,并且可以在进入Servlet之前或者之后进行一些处理。整个过程的顺序是Filter->Tomcat->Servlet->Controller,Interceptor可以在任意一个环节进行拦截。

发表回复