过滤器Filter,监听器Listener,拦截器Interceptor
过滤器Filter
概念:
Servlet过滤器是在java servlet规范2.3中定义的,他能够对servlet容器的请求和响应对象进行检查和修改。
Servlet过滤器本身并不产生请求和响应对象,他只能提供过滤作用,servlet过滤能够在servlet被调用之前检查request对象,修改request的header和request内容,在调用后检查response对象,修改response的头和内容。
Servlet过滤负责过滤的web组件可以是servlet,jsp或html文件。
特点:
过滤器可以检查和修改request和response对象
过滤器可以被指定url,当访问到该url时才会触发过滤
过滤器可以有很多个,串联使用,形成过滤器链。
作用:
查询请求并作出相应的行动
阻塞请求和响应
修改请求头和请求体,自定义请求
修改响应头和响应体,自定义响应
与外部资源进行交互
场景:
认证过滤,登录和审核过滤,加密过滤率,令牌过滤,资源访问出发事件过滤
接口构成:
过滤器都必须实现javax.servlet.Filter接口,主要有三种方法:
init方法:初始化时方法,容器启动时做读取一些初始化参数,
doFilter方法:实际进行过滤操作,具体怎么过滤,怎么修改在这里进行,
destroy方法:容器字啊销毁过滤器实例前调用的方法,可以释放资源。
Servlet过滤器对请求的过滤:
1,容器创建一个过滤实例
2,过滤器实例调用init方法,读取过滤器的初始化参数
3,过滤器实例调用doFilter方法,根据初始化参数进行判断
4,如果判断不合法就阻塞
5,如果合法就调用chain.doFilter方法将请求继续传递
Servlet过滤器的发布:
***************************************************************************************
A.发布Servlet过滤器时,必须在web.xml文件中加入<filter>元素和<filter-mapping>元素。
B.<filter>元素用来定义一个过滤器:
属性 含义
filter-name 指定过滤器的名字
filter-class 指定过滤器的类名
init-param 为过滤器实例提供初始化参数,可以有多个
C.<filter-mapping>元素用于将过滤器和URL关联:
属性 含义
filter-name 指定过滤器的名字
url-pattern 指定和过滤器关联的URL,为”/*”表示所有URL
拦截器Interceptor
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判断当前时间是否是购票时间。
SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式:
第一种方式是要定义的Interceptor类要实现了Spring 的HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ;
第二种方式是实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。
过滤器和拦截器的区别:
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
过滤器与拦截器的顺序(先过滤再做实际的拦截操作):
1.过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。
2.拦截器是被包裹在过滤器之中的。
3,
监听器Listener
Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。下面将介绍几种常用的监听器,以及它们都适合运用于那些环境。
分类及介绍:
1,ServletContextListener:用于监听WEB 应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener 接口。
2,ServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口。
3,HttpSessionListener:用于监听Session对象的创建和销毁,监听器类需要实现javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者两个都实现。
4,HttpSessionActivationListener:用于监听Session对象的钝化/活化事件,监听器类需要实现javax.servlet.http.HttpSessionListener接口或者javax.servlet.http.HttpSessionActivationListener接口,或者两个都实现。(没用过)
5,HttpSessionAttributeListener:用于监听Session对象属性的改变事件,监听器类需要实现javax.servlet.http.HttpSessionAttributeListener接口。 (没用过)
自己理解:过滤器是容器的一种功能,通过过滤器过滤一些url请求,然后针对特定的请求进行请求前的一些自定义处理,比如登录验证,拦截器之后再进行controller处理,处理后还可以进行拦截,针对返回请求前的一些处理,拦截器跟动态代理一样,在请求的前后可以做一些业务逻辑处理,
拦截器也是切面编程的一种实现,过滤下来的url请求做一些拦截操作。
声明:以上内容属于转载,对拦截器与过滤器概念比较模糊,所以找了几篇大神的博客进行学习,吧其中重要的转载过来,自己手写映像深刻些,保存起来防止找不到了。
转载于:https://blog.****.net/chenleixing/article/details/44573495
https://blog.****.net/jiangwei0910410003/article/details/23372847
http://elim.iteye.com/blog/1750680