这里是修真院后方的小教室,所有的共享句子都来源于此
【背景介绍】【知识分析】【常见问题】【解决方案】【编码实战】【思维拓展】【更多讨论】【参考文献】
从8个方面深入分析后端知识/技能,本篇分享的是:
【拦截器、过滤器、监听器分别有什么作用】
你好。 我是IT修真院西安分院第四期的JAVA学生,是诚实纯洁善良的JAVA程序员。 今天,让我们来看看拦截器、过滤器、监听器各自有什么作用。
一.背景介绍
1、拦截器
Interceptor是动态阻止操作调用的对象。 提供允许开发人员定义在Action中执行的机制
的前后执行的代码也可以在一个动作执行之前阻止其执行。 它还提供了可重用的功能,可以从Action中提取
的部分方法。
2、过滤器
Filter是实现javax.servlet.Filter接口的服务器端程序,主要用途是过滤字符代码和创建业务逻辑
判断,过滤器在web APP应用程序启动时启动,仅初始化一次,并且仅在web APP应用程序停止或重新部署时销毁
3、监听器
监听器是实现javax.servlet.servletcontextlistener接口的服务器端程序。
它也将在web APP启动时启动,仅初始化一次,并在web APP停止时销毁。
主要作用是添加初始化的内容、设置基本内容(如参数)或
固定的对象等。
二、知识分析
2 .知识解析
拦截器的实现方法:
主要有两种方法,第一种是实现HandlerInterceptor接口,第二种是实现WebRequestInterceptor接口。
拦截器的使用
用于项目:要在实现接口的类springMVC.xml中安装拦截器,请实现HandlerInterceptor或WebRequestInterceptor,然后安装相应的preHandle,posthaard
(1)处理程序接口
该接口定义了三种方法: preHandle (、postHandle )、afterCompletion ),并通过重写这三种方法来监听和处理用户请求
此外,Spring框架还提供了另一个接口和抽象类,用于扩展HandlerInterceptor接口。 分别是AsyncHandlerInterceptor和HandlerInterceptorAdapter。
在实际的APP应用程序中,通常实现HandlerInterceptor接口或继承HandlerInterceptorAdapter抽象类
1 )在处理请求之前调用的preHandle方法。
SpringMVC的拦截器是一个链调用,一个请求可以同时有多个拦截器。 每个Interceptor调用都按声明顺序依次执行,第一个执行的是preHandle方法,因此可以在此方法中执行预初始化操作、对当前请求进行预处理,以及确定是否继续请求。
返回false表示请求将终止,后续的Interceptor和控制器将不再运行。
如果返回值为true,则继续调用以下Interceptor pre handle方法;如果已经是最后一个interceptor,则调用当前请求的控制器方法:
2 )只有当前所属Interceptor的preHandle方法的返回值为true时,才会调用postHandle方法。
在处理当前请求后(即在控制器中的方法调用后)执行,但在返回视图并渲染dispatcher servlet之前调用,因此在此方法中,在控制器处理后ModelAndView
postHandle方法以与preHandle相反的方向调用,而先前声明的postHandle方法则相反执行。
3 ) afterCompletion方法也仅在当前相应的interceptor pre handle方法的返回值必须为true时执行。 因此,此方法在整个请求完成后执行,即dispatcher servlet渲染相应的视图后执行。 该方法的主要作用是资源清理工作。
)2) webrequest接口
此接口也定义了三种方法,与HandlerInterceptor接口完全相同,需要复盖这三种方法来拦截处理用户的请求。 并且,这三种方法都传递了相同的参数WebRequest。
其中的方法是
HttpServletRequest 类似,在WebRequestInterceptor中对 WebRequest 进行的所有操作都将同步到 HttpServletRequest 中,然后在当前请求中依次传递。1)preHandle(WebRequest request)方法,该方法跟 HandlerInterceptor 中的 preHandle 不同,
主要区别在于该方法无返回值。因此不能通过返回值决定是否终止请求。其主要作用是进行资源的准备工作。
2)postHandle(WebRequest request, ModelMap model)方法,同样也是在controller之后,
视图返回被渲染之前被调用。该方法有两个参数,WebRequest 对象是用于传递整个请求数据的,
比如在 preHandle 中准备的数据都可以通过 WebRequest 来传递和访问;
3)afterCompletion(WebRequest request, Exception ex)方法,同样是在视图渲染之后调用, 主要用来进行资源的释放。
过滤器
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter 技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。
Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:
调用目标资源之前,让一段代码执行;
是否调用目标资源(即是否让用户访问web资源);
调用目标资源之后,让一段代码执行。
过滤器的使用
项目中使用:编写实现接口的类+web.xml中配置
过滤器只需要实现javax.servlet.filter,重写doFilter(...)、init(...)和destroy(..)方法即可
web服务器在调用doFilter方法时,会传递一个filterChain对象进来,
filterChain对象是filter接口中最重要的一个对 象,它也提供了一个doFilter方 ,开发人员可以根据需求决定是否调用此方法,调用该方法,
则web服务器就会调用web资源的service方 法,即web资源就会被访问,否则web资源不会被访问。
过滤器中的方法
init: 程序启动时,web服务器将创建Filter的实例对象,并调用其init方法,完成对象的初始化 功能;filter对象只会创建一次,init方法也只会执行一次。
doFilter:当访问web服务器时对请求进行操作。
destroy:web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。
监听器
监听web应用,监听许多信息的初始化,销毁,增加,修改,删除等 。
监听器对象可以在事情发生前、发生后可以做一些必要的处理。
监听器的分类
1、ServletContext监听
ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)。
ServletContextAttributeListener:对Servlet上下文属性的监听(增删改属性)。
需要实现ServeltContextAttrbuteListener接口;
2、Session监听
HttpSessionListener接口:对Session的整体状态的监听。
HttpSessionAttributeListener接口:对session的属性监听。
主要监听session属性的更改、添加、删除,需要实现HttpSessionAttrbuteListener接口
3、Request监听
ServletRequestListener:用于对Request请求进行监听(创建、销毁)。
ServletRequestAttributeListener:对Request属性的监听(增删改属性)。
需要实现ServletRequestAttrbuteListener接口;
监听器的使用
项目中使用:编写实现接口的类+web.xml中配置
监听器接口主要有四类八种,能够监听包括request域,session域,
application域的产生,销毁和属性的变化
监听对象的创建:1.ServletContext:主要监听servletContext的创建,
需要实现ServeltContextListener接口;
2.ServletRequest:主要监听request的创建,
需要实现ServletRequestListener接口;3.HttpSession:主要监听session的创建,
需要实现HttpSessionListener接口
三、常见问题
拦截器、过滤器、监听器的区别是什么?
四、解决方案
1.从关注的点来说:过滤器拦截器作用域web请求,并对一些信息做相应的更改;监听器作用于系统级别的参数的监听,一般不做更改。
2.所依赖的支持来说:拦截器需要Spring的支持;过滤器、监听器需要servlet的支持。
3.应用场景的不同
拦截器:拦截未登录、审计日志等;
过滤器:设置字符编码、URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等;
监听器:统计在线人数、清除过期session
五、编码实战
六、扩展思考
1.拦截器、过滤器、监听器的执行顺序?
1.拦截器、过滤器、监听器的执行顺序
监听器 > 过滤器 > 拦截器 > servlet执行 > 拦截器 > 过滤器 > 监听器
七、参考文献
https://www.cnblogs.com/qdhxhz/p/8468913.html
八、更多讨论
Q1:(西安分院秦永辉)2.多个拦截器的执行顺序(两个)
(1)当俩个拦截器都实现放行操作时,顺序为preHandle 1,preHandle 2,postHandle 2,postHandle 1,afterCompletion 2,afterCompletion 1;
(2)当第一个拦截器preHandle返回false,也就是对其进行拦截时,第二个拦截器是完全不执行的,第一个拦截器只执行preHandle部分;
(3)当第一个拦截器preHandle返回true,第二个拦截器preHandle返回false,顺序为preHandle 1,preHandle 2 ,afterCompletion 1。
Q2:(西安分院zxdpkq).多个过滤器的执行顺序
web服务器根据Filter在web.xml中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法,在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第二个filter,如果没有,则调用目标资源。
Q3: (西安分院秦永辉) 4.多个监听器的执行顺序
一个webServlet里面若有多个监听器的话,顺序是按照加载的顺序来加载和注册的这些servlet监听器的。
这里是技能树.IT修真院,成千上万的畅快的面包在这里找到了自己的学习路线,学习透明化,成长可见化,畅快的面包1对1免费指导。快来与我一起学习吧~我的邀请码:28769611,或者你可以直接点击此链接:http://www.jnshu.com/login/1/28769611
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
更多内容,可以加入IT交流群565734203与大家一起讨论交流
这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地