Java中的过滤器Filter和拦截器Interceptor

Java中的过滤器Filter和拦截器Interceptor

  • 前言
  • 1、过滤器
    • (1)作用
    • (2)生命周期
  • 2、拦截器
    • (1)作用
    • (2)生命周期
  • 3、区别
  • 4、总结

前言

过滤器和拦截器在Java Web应用程序中,都用于请求处理过程中执行特定的操作。

1、过滤器

(1)作用

过滤器执行是在Servlet之前。客户端发送请求,先经过Filter,再到达目标Servlet;响应时,再根据执行流程反向执行Filter。一般用于通用的操作,例如登录验证、统一编码处理、敏感字符过滤等。

Java中的过滤器Filter和拦截器Interceptor_第1张图片

(2)生命周期

Filter接口:

  • init():该方法在容器启动初始化过滤器时被调用,它在Filter整个生命周期中只会被调用一次。这个方法必须执行成功,否则过滤器不会起作用。

  • doFilter():容器中的每一次请求都会调用该方法。

  • destroy():当容器销毁过滤器实例时调用,一般在该方法中销毁或关闭资源,在整个Filter的生命周期中也只会被调用一次。

过滤器的doFilter(ServletRequest request, ServletResponse response, FilterChain chain)的入参是ServletRequest ,而不是HttpServletRequest,它可以完成任何协议的过滤操作。


2、拦截器

(1)作用

拦截器采用AOP的设计思想,用来拦截在处理方法之前和之后执行的一些功能。例如权限控制、性能监控、事物管理等。

拦截器可以获取IOC容器中的各个Bean,在拦截器中注入一个Service,可以调用业务逻辑。

(2)生命周期

HandlerInterceptor接口:

  • preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) :这个方法将在请求处理之前进行调用。注意:如果该方法的返回值为false ,将视为当前请求结束,不仅自身的拦截器会失效,还会导致其他的拦截器也不再执行。
  • postHandle(HttpServletRequest request, HttpServletResponse response, Object handler):只有在 preHandle() 方法返回值为true 时才会执行。会在Controller 中的方法调用之后,DispatcherServlet 返回渲染视图之前被调用。 此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。
  • afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler):只有在 preHandle() 方法返回值为true 时才会执行。在整个请求结束之后, DispatcherServlet 渲染了对应的视图之后执行。如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try­catch­finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器才会执行。

补充:

多个拦截器的执行顺序

1、若每个拦截器的preHandle()都返回true
此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关:preHandle()会按照配置的顺序执行,而postHandle()和afterCompletion()会按照配置的反序执行。

2、若某个拦截器的preHandle()返回了false
preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterCompletion()会执行。


3、区别

1、过滤器依赖于Servlet容器,而拦截器依赖SpringMVC;

2、过滤器是JavaEE标准,采用函数回调的方式,而拦截器是基于Java反射;

在我们自定义的过滤器中都会实现一个 doFilter()方法,这个方法有一个FilterChain 参数,而实际上它是一个回调接口。ApplicationFilterChain是它的实现类, 这个实现类内部也有一个 doFilter() 方法就是回调方法。

3、过滤器几乎对所有的请求都可以起作用,而拦截器只能对SpringMVC请求起作用;

4、拦截器可以访问处理方法的上下文,而过滤器不可以;

5、触发时机不同,过滤器是在请求进入容器后,但在进入servlet之前进行预处理,在请求结束返回之前进行后处理,而拦截器是在请求进入servlet之后,进入Controller之前进行预处理,Controller中渲染了对应的试图后请求结束。

Java中的过滤器Filter和拦截器Interceptor_第2张图片

4、总结

过滤器:从一堆东西中筛选出符合要求的,例如过滤敏感信息;

拦截器:干预到一个请求当中,不符合可以直接终止,例如鉴权,qos设置。


内容参考:
https://zhuanlan.zhihu.com/p/484289805
https://blog.csdn.net/w_l666/article/details/131703341

你可能感兴趣的:(Java基础知识,java,开发语言,tomcat)