java过滤器原理,拦截器,过滤器,监听器 区别及执行顺序

本文引用该作者(花开半夏)著作内容,觉得写的很好,记录一下便于回看防止失踪,更多详情请查看原作者。
同时还搜罗了其他便于理解的博文感兴趣的可以看看促进理解
拦截器,过滤器,监听器执行顺序(被拦截个人过滤器)
https://javaforall.cn/128546.html
这里是修真院后方的小教室,所有的共享句子都来源于此

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

从8个方面深入分析后端知识/技能,本篇分享的是:

【拦截器、过滤器、监听器分别有什么作用? 】

你好。 我是IT修真院郑州分院第十届学生,诚实纯洁善良的JAVA程序员。

今天分享给大家,修真院官网JAVA任务五、拓展思维的知识点——拦截器、过滤器、监听器分别有什么作用?

一、背景介绍

1 .过滤器

依赖于servlet容器。 虽然实现中几乎可以基于函数回调过滤所有请求,但它的缺点是在容器初始化时只调用一个过滤器实例。 使用过滤器的目的是进行在过滤器中变更字符代码等用于获取想要获取的数据的过滤器操作。 在过滤器中更改http servlet request的一些参数。 这包括低俗文字、危险文字等过滤。

2 .拦截器

依赖于web框架,在SpringMVC中依赖于SpringMVC框架。 实现中基于Java的反射是面向切片编程(AOP )的一种操作。 拦截器是基于web框架的调用,因此可以使用Spring的dependentinmultiplexing执行一些业务操作。 此外,拦截器实例可以在控制器的生命周期中多次调用。 然而,它的缺点是只能阻止控制器请求,而不能阻止直接访问静态资源等其他请求。

3 .监听器

web侦听器是servlet中的特殊类,可以帮助开发人员监视web上的特定事件。 实现javax.servlet.servletcontextlistener接口的服务器端程序,随web APP应用程序的启动而启动,只初始化一次,随web APP应用程序的停止而销毁。 主要作用是感知初始化和属性的变化,如请求、会话和应用程序。

二、知识分析

1 .拦截器的使用

在项目中使用:在实现接口的类springMVC.xml中配置

过滤器实现HandlerInterceptor或WebRequestInterceptor,并使用适当的prehandle(…)、postHandle)和afterCompletion)方法

(1) preHandle方法在处理请求之前调用。 因此,可以用这种方法执行一些预初始化操作,预处理当前请求,或者用这种方法作出一些判断以确定是否继续请求。 此方法的返回值是布尔值Boolean类型,返回false表示请求将终止,后续的Interceptor和Controller将不再运行。 如果返回值为true,则继续调用以下Interceptor pre handle方法;如果已经是最后一个interceptor,则调用当前请求的控制器方法:

)2) postHandle方法顾名思义在处理当前请求后执行,也就是在调用控制器方法后执行,但在dispatcher servlet返回视图进行渲染之前调用,因此此方法

)3)在整个请求结束后,即在DispatcherServlet渲染相应的视图后,执行afterCompletion方法。 该方法的主要作用是用于资源的整理工作。

2 .使用过滤器

在项目中使用:在实现接口的类web.xml中编写配置

过滤器只需实现javax.servlet.filter并重写dofilter(…)、init)、destroy)方法

实现doFilter方法以完成对请求或响应的过滤

实现init方法并读取过滤器的初始化参数

destroy (),在销毁过滤器时进行某些操作

3 .使用监听器

在项目中使用:在实现接口的类springMVC.xml中配置

侦听器接口主要有四种八种,可以监听请求域、会话域、应用程序域的生成、销毁和属性更改

创建监听对象:

)1) ServletContext:主要监听servletContext的创建,需要实现ServeltContextListener接口;

)2) ServletRequest:主要监听请求的创建,需要实现ServletRequestListener接口;

)3) http会话:主要需要监听会话的创建,实现http会话监听器接口

接收属性更改:

)1) ServletContext:主要需要拦截servletContext属性的修改、添加、删除,实现ServeltContextAttrbuteListener接口;

)2) servlet request :主要监听请求
t属性的更改、添加、删除, 需要实现ServletRequestAttrbuteListener接口; (3)HttpSession:主要监听session属性的更改、添加、删除,需要实现HttpSessionAttrbuteListener接口。

监听session的活化与钝化:httpSessionActivationListener主要监听了session的活化与钝化。

监听session与对象的绑定:httpSessionBindingListener监听了session与对象的绑定。

三、常见问题及解决

拦截器、过滤器、监听器的区别是什么?

1.从关注的点来说:过滤器拦截器作用域web请求,并对一些信息做相应的更改;监听器作用于系统级别的参数的监听,一般不做更改。

2.所依赖的支持来说:拦截器需要Spring的支持;过滤器、监听器需要servlet的支持。

3.应用场景的不同

(1)拦截器:拦截未登录、审计日志等;

(2)过滤器:设置字符编码、URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等;

(3)监听器:统计在线人数、清除过期session。

四、编码实战

详见视频。

五、扩展思考

1.拦截器、过滤器、监听器的执行顺序

监听器 > 过滤器 > 拦截器 > servlet执行 > 拦截器 > 过滤器 > 监听器

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。

3.多个过滤器的执行顺序

web服务器根据Filter在web.xml中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法,在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第二个filter,如果没有,则调用目标资源。

4.多个监听器的执行顺序

一个webServlet里面若有多个监听器的话,顺序是按照加载的顺序来加载和注册的这些servlet监听器的。

七、更多讨论

1.怎样使用自定义注解实现拦截器?

首先需要定义一个自定义的注解

@Target(ElementType.METHOD )

@Retention(RetentionPolicy.RUNTIME)

public @interface AccessRequired {

}

这里的ElementType.METHOD 表示的是对方法有效

RetentionPolicy.RUNTIME

一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解

然后在编写自己的拦截器,web.xml文件中也需要配置

最后在需要拦截的方法上标上自定义注解,表示需要拦截这个方法。

2.未登录或者非vip的话,可以试看10分钟怎么解决 ?

将视频分段,前十分钟是一个请求,之后再次请求,拦截后边这个请求

3.拦截器与过滤器的区别 :

(1)拦截器是基于java的反射机制的,而过滤器是基于函数回调。

(2)拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

(3)拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

(4)拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

(5)在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次

猜你喜欢

转载自blog.csdn.net/m0_46364149/article/details/127103963