java中过滤器、监听器、拦截器机制的实例详解
一、过滤器
Filter也称之为过滤器,它是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
一般与spring架构一起用在以下几个地方:
1.1 处理字符写入数据库编码问题,在web.xml中配置一下代码


1 <filter> 2 <filter-name>Encoding</filter-name> 3 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 4 <init-param> 5 <param-name>encoding</param-name> 6 <param-value>utf-8</param-value> 7 </init-param> 8 </filter> 9 <filter-mapping>10 <filter-name>Encoding</filter-name>11 <url-pattern>/*</url-pattern>12 </filter-mapping>
1.2 处理与mongodb整合出现的初始化先后加载问题,使用Filter完成代理功能


1 <!-- 告诉ContextLoaderListener叫在spring的配置文档的位置--> 2 <context-param> 3 <param-name>contextConfigLocation</param-name> 4 <param-value> 5 classpath:spring-shiro-web.xml, 6 /WEB-INF/spring-servlet.xml 7 </param-value> 8 </context-param> 9 10 <filter>11 <filter-name>shiroFilter</filter-name>12 <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>13 <init-param>14 <param-name>targetFilterLifecycle</param-name>15 <param-value>true</param-value>16 </init-param>17 </filter>18 <!-- Make sure any request you want accessible to Shiro is filtered. /* catches all -->19 <!-- requests. Usually this filter mapping is defined first (before all others) to -->20 <!-- ensure that Shiro works in subsequent filters in the filter chain: -->21 <filter-mapping>22 <filter-name>shiroFilter</filter-name>23 <url-pattern>/*</url-pattern>24 </filter-mapping>25 26 <!-- 在tomcat启动的时候优先加载spring的配置文档 -->27 <listener> 28 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 29 </listener>
过滤器生命周期的四个阶段:
<span style="font-size: 14px">1、实例化:Web容器在部署Web应用程序时对所有过滤器进行实例化。Web容器回调它的无参构造方法。</span><br><span style="font-size: 14px">2、初始化:实例化完成之后,马上进行初始化工作。Web容器回调init()方法。</span>
3、过滤:请求路径匹配过滤器的URL映射时。Web容器回调doFilter()方法——主要的工作方法。
4、销毁: Web容器在卸载Web应用程序前,Web容器回调destroy()方法。
二、监听器
监听器Listener就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
Listener是Servlet的监听器,可以监听客户端的请求和服务端的操作等。
主要有以下三类:
1、ServletContext监听
ServletContextListener:用于对Servlet整个上下文进行监听(创建、销毁)。
ServletContextAttributeListener:对Servlet上下文属性的监听(增删改属性)。
2、Session监听
Session属于http协议下的内容,接口位于javax.servlet.http.*包下。
HttpSessionListener接口:对Session的整体状态的监听。
HttpSessionAttributeListener接口:对session的属性监听。
session的销毁有两种情况:
2.1 session超时,web.xml配置: <session-config> <session-timeout>120session-timeout>
session-config>
2.2 手工使session失效 public void invalidate();//使session失效方法。session.invalidate();
3、Request监听
ServletRequestListener:用于对Request请求进行监听(创建、销毁)。
ServletRequestAttributeListener:对Request属性的监听(增删改属性)。
4、在web.xml中配置
Listener配置信息必须在Filter和Servlet配置之前,Listener的初始化(ServletContentListener初始化)比Servlet和Filter都优先,
而销毁比Servlet和Filter都慢。
<listener> <listener-class>com.listener.classlistener-class> listener>
<context-param> <param-name>contextConfigLocationparam-name>
<param-value>classpath:spring/applicationContext-*.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
4、1 Spring使用IntrospectorCleanupListener清理缓存
这个监听器的作用是在web应用关闭时刷新JDK的JavaBeans的Introspector缓存,以确保Web应用程序的类加载器以及其加载的类正确的释放资源。
如果JavaBeans的Introspector已被用来分析应用程序类,系统级的Introspector缓存将持有这些类的一个硬引用。因此,这些类和Web应用程序的类加载器在Web应用程序关闭时将不会被垃圾收集器回收!而IntrospectorCleanupListener则会对其进行适当的清理,已使其能够被垃圾收集器回收。
唯一能够清理Introspector的方法是刷新整个Introspector缓存,没有其他办法来确切指定应用程序所引用的类。这将删除所有其他应用程序在服务器的缓存的Introspector结果。
在使用Spring内部的bean机制时,不需要使用此监听器,因为Spring自己的introspection results cache将会立即刷新被分析过的JavaBeans Introspector cache,而仅仅会在应用程序自己的ClassLoader里面持有一个cache。虽然Spring本身不产生泄漏,注意,即使在Spring框架的类本身驻留在一个“共同”类加载器(如系统的ClassLoader)的情况下,也仍然应该使用IntrospectorCleanupListener。在这种情况下,这个IntrospectorCleanupListener将会妥善清理Spring的introspection cache。
应用程序类,几乎不需要直接使用JavaBeans Introspector,所以,通常都不是Introspector resource造成内存泄露。相反,许多库和框架,不清理Introspector,例如: Struts和Quartz。
需要注意的是一个简单Introspector泄漏将会导致整个Web应用程序的类加载器不会被回收!这样做的结果,将会是在web应用程序关闭时,该应用程序所有的静态类资源(比如:单实例对象)都没有得到释放。而导致内存泄露的根本原因其实并不是这些未被回收的类!
注意:IntrospectorCleanupListener应该注册为web.xml中的第一个Listener,在任何其他Listener之前注册,比如在Spring's ContextLoaderListener注册之前,才能确保IntrospectorCleanupListener在Web应用的生命周期的适当时机生效。
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListenerlistener-class>
listener>
三、spring拦截器
spring 管理的拦截器需要继承Intercepter implements HandlerInterceptor
要进入拦截器优先需要配置spring的入口
以上这种写法不会过滤掉.jsp结尾的url,若需要处理.jsp需要配合过滤器使用,或者使用shiro架构
但是一般的静态资源我们不需要过滤拦截,可以使用如下配置
web.xml配置
spring-servlet.xml配置,注意头部文件的添加
以上是java中过滤器、监听器、拦截器机制的实例详解的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

胶囊是一种三维几何图形,由一个圆柱体和两端各一个半球体组成。胶囊的体积可以通过将圆柱体的体积和两端半球体的体积相加来计算。本教程将讨论如何使用不同的方法在Java中计算给定胶囊的体积。 胶囊体积公式 胶囊体积的公式如下: 胶囊体积 = 圆柱体体积 两个半球体体积 其中, r: 半球体的半径。 h: 圆柱体的高度(不包括半球体)。 例子 1 输入 半径 = 5 单位 高度 = 10 单位 输出 体积 = 1570.8 立方单位 解释 使用公式计算体积: 体积 = π × r2 × h (4
