Servlet、Filter、Listener、Interceptor
程序员文章站
2022-04-22 09:40:31
...
转载一篇博客:关于Filter与Interceptor的区别
http://blog.csdn.net/zuoluoboy/article/details/19750699
首先,JSP/Servlet规范中定义了Servlet、Filter、Listener这三种角色,并没有定义Interceptor这个角色,Interceptor是某些MVC框架中的角色,比如Struts2中,Interceptor是用来拦截Action中的方法的调用,在被拦截的Action方法被执行前,先执行响应的拦截器中的方法。
servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的拦截器配置到struts.xml中。spring的拦截器配置到spring.xml中。
servlet、filter、listener三者的加载顺序与它们在 web.xml 文件中配置的先后顺序无关。即不会因为filter写在listener的前面而会先加载filter:加载它们的先后顺序是:listener -> filter -> servlet
同时还存在着这样一种配置节:context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的 listener, filter 等在初始化时会用到这些上下文中的信息,那么 context-param 配置节是不是应该写在 listener 配置节前呢?实际上 context-param 配置节可写在任意位置,因此真正的加载顺序为:context-param -> listener -> filter -> servlet
context-param、listener、 filter、 servlet的加载顺序不是配置时先后顺序的影响,但是多个filter时,filter之间的加载顺是受影响的。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。
==================================Filter=============================================
filter过滤器是在Java Servlet规范2.3中定义的,在Java Servlet规范2.3出来之前,是没有filter这个角色的。
filter这个角色是用来:在请求到达servlet之前,先截获请求,对请求先做一些预处理(例如编码转换,权限验证)。处理完后在把请求转发给servlet或把不符合某些规则的请求丢弃掉,不再转发给servlet了。当servlet处理好请求后,返回响应给浏览器时,filter拦截响应,对响应做一些处理之后,再返回给浏览器。由此可见,filter这个角色的职责就是:帮servlet做一些前期预处理工作(先于servlet处理request)和善后工作(后于servlet处理response)的辅助角色,它就像servlet的助手一样,但它并不是必须的,因为在之前没有filter的时候,servlet也能很好地工作。只是如果有filter的帮助的话,servlet就能更专注处理一些核心的业务。
多个filter可以协同工作,它们之间采用了职责链的设计模式来协同工作。一个filter处理完后,调用下一个filter来处理,每个filter负责处理不同的工作,而这些filter之间可以根据需要灵活组合。filter的先后顺序按filter在web.xml中配置的先后顺序。
filter需要servlet容器(tomcat)的支持,能运行filter的servlet容器必须实现在Java Servlet规范2.3版中定义的功能。servlet容器是对javax.servlet.Filter这个接口进行编程的,所以你自己写的filter必须直接或间接的实现了javax.servlet.Filter这个接口,否则servlet容器不能跟你定义的filter进行交互(因为在编程实现容器时,就把javax.servlet.Filter这个接口编进容器代码中了,容器只能调用javax.servlet.Filter接口的实现类)。
=====================================Listener============================================
listener是对事件进行监听和处理的角色,它采用观察者模式,只有当在这个listener上注册了的事件
发生时,listener才会执行事件处理方法。这些事件举例:上下文(context)加载事件;session创建或销毁事件;容器、session或请求的属性设置或移除事件等。
servlet2.4规范中提供了8个listener接口,可以将其分为三类,分别如下:
第一类:与servletContext(Application)有关的listner接口。包括:ServletContextListener、ServletContextAttributeListener
第二类:与HttpSession有关的Listner接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、 HttpSessionActivationListener;
第三类:与ServletRequest有关的Listener接口,包括:ServletRequestListner、ServletRequestAttributeListener
=====================================Interceptor=========================================
Interceptor是某些MVC框架中的角色,比如Struts2中,Interceptor是用来拦截Action中的方法的调用,在被拦截的Action方法被执行前,先执行响应的拦截器中的方法。interceptor:是在面向切面编程的,就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法,比如动态代理就是拦截器的简单实现。filter是在servlet前面拦截请求,而interceptor是利用面向切面编程的技术,在Struts的内部Action中拦截调用方法请求。
http://blog.csdn.net/zuoluoboy/article/details/19750699
首先,JSP/Servlet规范中定义了Servlet、Filter、Listener这三种角色,并没有定义Interceptor这个角色,Interceptor是某些MVC框架中的角色,比如Struts2中,Interceptor是用来拦截Action中的方法的调用,在被拦截的Action方法被执行前,先执行响应的拦截器中的方法。
servlet、filter、listener是配置到web.xml中,interceptor不配置到web.xml中,struts的拦截器配置到struts.xml中。spring的拦截器配置到spring.xml中。
servlet、filter、listener三者的加载顺序与它们在 web.xml 文件中配置的先后顺序无关。即不会因为filter写在listener的前面而会先加载filter:加载它们的先后顺序是:listener -> filter -> servlet
同时还存在着这样一种配置节:context-param,它用于向 ServletContext 提供键值对,即应用程序上下文信息。我们的 listener, filter 等在初始化时会用到这些上下文中的信息,那么 context-param 配置节是不是应该写在 listener 配置节前呢?实际上 context-param 配置节可写在任意位置,因此真正的加载顺序为:context-param -> listener -> filter -> servlet
context-param、listener、 filter、 servlet的加载顺序不是配置时先后顺序的影响,但是多个filter时,filter之间的加载顺是受影响的。web 容器启动时初始化每个 filter 时,是按照 filter 配置节出现的顺序来初始化的,当请求资源匹配多个 filter-mapping 时,filter 拦截资源是按照 filter-mapping 配置节出现的顺序来依次调用 doFilter() 方法的。
==================================Filter=============================================
filter过滤器是在Java Servlet规范2.3中定义的,在Java Servlet规范2.3出来之前,是没有filter这个角色的。
filter这个角色是用来:在请求到达servlet之前,先截获请求,对请求先做一些预处理(例如编码转换,权限验证)。处理完后在把请求转发给servlet或把不符合某些规则的请求丢弃掉,不再转发给servlet了。当servlet处理好请求后,返回响应给浏览器时,filter拦截响应,对响应做一些处理之后,再返回给浏览器。由此可见,filter这个角色的职责就是:帮servlet做一些前期预处理工作(先于servlet处理request)和善后工作(后于servlet处理response)的辅助角色,它就像servlet的助手一样,但它并不是必须的,因为在之前没有filter的时候,servlet也能很好地工作。只是如果有filter的帮助的话,servlet就能更专注处理一些核心的业务。
多个filter可以协同工作,它们之间采用了职责链的设计模式来协同工作。一个filter处理完后,调用下一个filter来处理,每个filter负责处理不同的工作,而这些filter之间可以根据需要灵活组合。filter的先后顺序按filter在web.xml中配置的先后顺序。
filter需要servlet容器(tomcat)的支持,能运行filter的servlet容器必须实现在Java Servlet规范2.3版中定义的功能。servlet容器是对javax.servlet.Filter这个接口进行编程的,所以你自己写的filter必须直接或间接的实现了javax.servlet.Filter这个接口,否则servlet容器不能跟你定义的filter进行交互(因为在编程实现容器时,就把javax.servlet.Filter这个接口编进容器代码中了,容器只能调用javax.servlet.Filter接口的实现类)。
=====================================Listener============================================
listener是对事件进行监听和处理的角色,它采用观察者模式,只有当在这个listener上注册了的事件
发生时,listener才会执行事件处理方法。这些事件举例:上下文(context)加载事件;session创建或销毁事件;容器、session或请求的属性设置或移除事件等。
servlet2.4规范中提供了8个listener接口,可以将其分为三类,分别如下:
第一类:与servletContext(Application)有关的listner接口。包括:ServletContextListener、ServletContextAttributeListener
第二类:与HttpSession有关的Listner接口。包括:HttpSessionListner、HttpSessionAttributeListener、HttpSessionBindingListener、 HttpSessionActivationListener;
第三类:与ServletRequest有关的Listener接口,包括:ServletRequestListner、ServletRequestAttributeListener
=====================================Interceptor=========================================
Interceptor是某些MVC框架中的角色,比如Struts2中,Interceptor是用来拦截Action中的方法的调用,在被拦截的Action方法被执行前,先执行响应的拦截器中的方法。interceptor:是在面向切面编程的,就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法,比如动态代理就是拦截器的简单实现。filter是在servlet前面拦截请求,而interceptor是利用面向切面编程的技术,在Struts的内部Action中拦截调用方法请求。
上一篇: 手把手教你自定义IP访问次数限制器
下一篇: 不同Servlet的配置顺序
推荐阅读
-
Web基础了解版10-Filter-Listener
-
Filter过滤器和Listener监听器详解
-
servlet/filter/listener/interceptor区别与联系
-
程序员,你还不会合理选择Filter、Interceptor、Aspect?
-
拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
-
Filter,Interceptor,AOP 区别与实例
-
Filter Interceptor AOP
-
spring中过滤器(filter)、拦截器(interceptor)和切面(aop)的执行顺序
-
SpringBoot的filter、listener、interceptor、AOP
-
SpringBoot的filter、listener、interceptor、AOP