1.背景介绍
过滤器:依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等
拦截器:依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。
web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,比如ServletContext,HttpSession,ServletRequest的创建和销毁;变量的创建、销毁和修改等。可以在某些动作前后增加处理,实现监控。
2.知识剖析
Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,
都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:调用目标资源之前,让一段代码执行。是否调用目标资源(即是否让用户访问web资源)。调用目标资源之后,让一段代码执行。
web应用程序启动时,web服务器将创建Filter的实例对象,并调用其init方法,完成对象的初始化
功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。
web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。
SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,HandlerInterceptor 接口中定义了三个方法,preHandle在执行控制器前执行、postHandle在渲染视图之前执行、afterCompletion在渲染视图之后执行,通过这三个方法来对用户的请求进行拦截处理的。
Listener 的作用是用于监听 web应用的创建和销毁以及在其上attribute发生的变化。除了对web应用的监听外还能监听session和request的生命周期以及他们的attribute发生的变化。 监听器常用的用途:统计在线人数,利用HttpSessionLisener、加载初始化信息:利用ServletContextListener、统计网站访问量、实现访问监控。
3.常见问题
1过滤器,监听器,拦截器的执行顺序
2:过滤器如何实现拦截
3拦截器和AOP是什么关系
4.解决方案
1监听器-过滤器-拦截器
2.
Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源进行拦截后,web服务器在每次调用方法之前,都会先调用一下filter的doFilter方法,因此,可以达到以下目的:
调用目标之前,让一段代码执行
是否调用目标资源(即是否让用户访问web资源)
3AOP也是拦截器的一种,通常用在维护数据操作层,拦截器多用于验证登陆状态之类的。
5.编码实战
过滤器,监听器,拦截器的配置
6.扩展思考
7.参考文献
https://blog.csdn.net/xiaoyaotan_111/article/details/53818043
https://www.cnblogs.com/w-wfy/p/6425357.html
8.更多讨论