首页 > 编程知识 正文

java过滤器原理(java过滤器和监听器)

时间:2023-05-06 08:58:42 阅读:69781 作者:2409

这里是修真院后方的小教室,所有的共享句子都来源于此

【背景介绍】【知识分析】【常见问题】【解决方案】【编码实战】【思维拓展】【更多讨论】【参考文献】

从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,初学者转行到互联网的聚集地

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。