过滤器、监听器、拦截器概念

概念

  1.servlet:servlet是一种运行服务器端的java应用程序,具有独立于平台和协议的特性,

可以动态生成web页面它工作在客户端请求与服务器响应的中间层;

  2.filter:filter是一个可以复用的代码片段,可以用来转换HTTP请求,响应和头信息。

它不能产生一个请求或者响应,它只是修改对某一资源的请求或者响应;

  3.listener:监听器,通过listener可以坚挺web服务器中某一执行动作,并根据其要求作出相应的响应。

就是在application,session,request三个对象创建消亡或者往其中添加修改删除属性时自动执行代码的功能组件;

  4.interceptor:拦截器是对过滤器更加细化的应用,他不仅可以应用在service方法前后还可以应用到其他方法的前后

拦截器;

  5.servlet,filter,listener是配置到web.xml中,interceptor不配置到web.xml中,struts的拦截器配置到struts。xml中。

spring的拦截器配置到spring.xml中;
 

过滤器和拦截器的区别

先说最易混淆的过滤器和拦截器的区别:

    1拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  2拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  3拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  4拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  5在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
    6拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

 

 过滤器、监听器、拦截器的生命周期

1.servlet

  servle的生命周期开始于被装入web服务器的内存中,并在web服务终止或者重新装入servlet的时候结束;

servlet一旦被装入web服务器,一般不会从web服务器内存中删除;直到web服务器关闭;

  装入:启动服务器时加载servlet的实例;

  初始化:web服务器接收到请求时,或者两者之间的某个时刻启动,调用init()

  调用:从第一次到以后的多次访问,都只调用doGet()或dopost)()方法;

  销毁;停止服务器时调用destroy()方法,销毁实例;

  2.filter

  需要实现javax.servlet包的Filter接口的三个方法init(),doFilter(),destroy();

  加载:启动服务器时加载过滤器的实例,并调用init()方法;

  调用:每次请求的时候只调用方法doFilter()进行处理;

  销毁:服务器关闭前调用destroy()方法,销毁实例;

  3.listener

  web.xml的加载顺序是:context-param->listener->filter->servlet

  4.interceptor

  加载配置文件后初始化拦截器,当有对action的请求的时候,调用interceptor方法,最后也是根据服务器停止进行销毁;

  过滤器、监听器、拦截器的职责

1.servlet

  创建并返回一个包含基于客户请求性质的动态内容的完整的html页面

  创建可嵌入到现有的html页面中的一部分html页面(html片段)

  读取客户端发来的隐藏数据

  读取客户端发来的显示数据

  与其他服务器资源(包括数据库和java的应用程序)进行通信

  2.filter

  filter能够在一个请求到达servlet之前预处理用户请求,也可以在离开servlet时处理http响应:

  在执行servlet之前,首先执行filter程序,并为之做一些预处理工作;

  在servlet被调用之后截获servlet的执行

  3.listener

  servlet2.4规范提供了8个listener接口,可以将其分为三类,分别如下;

  第一类:与HttpContext有关的listener接口,包括:ServletContextListener、ServletContextAttributeListener

  第二类:与HttpSession有关的listner接口。包括:HttpSessionListener、HttpSessionAttributeListener、

HttpSessionBindingListener、 HttpSessionActivationListener、

  第三类:与ServletRequest有关的Listener接口,包括:ServletRequestListener、ServletRequestAttributeListener

     4.interceptor

  与过滤器类似,通过层层拦截,处理用户的请求和响应;

  过滤器、监听器、拦截器的图解

这个很重要,注意在shiro或者springsecurity配置安全相关的时候,如果异常无法捕获,往往就是web请求顺序导致的,比如你配置了全局异常,但是异常请求如果没有到达controller层,那么全局异常依然无法捕捉到这类异常,因为请求都没有发到控制层(servlet那一层),在Filter层已经报权限不足异常那么直接就返回了,所以在前后端分离传递jwt配置的token校验时,如果异常返回的403无法以想要的json3段式或者4段式返回.同样AOP日志也是无法捕获的,包括各种增强,连环绕增强都无法捕获这个安全框架的403异常

1.servlet:

  

  2.filter

  

  

  3.listener

  

  4.interceptor

  

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐