`
qingfeng_lxc
  • 浏览: 31876 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

Spring 所提供的过滤器和监听器

    博客分类:
  • java
阅读更多

Spring 为 Web 应用提供了几个过滤器和监听器,在适合的时间使用它们,可以解决一些常见的 Web 应用问题。

延迟加载过滤器

Hibernate 允许对关联对象、属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Session 范围之内进行。如果 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些需要延迟加载的数据时,由于加载领域对象的 Hibernate Session 已经关闭,这些导致延迟加载数据的访问异常。

Spring 为此专门提供了一个 OpenSessionInViewFilter 过滤器,它的主要功能是使每个请求过程绑定一个 Hibernate Session,即使最初的事务已经完成了,也可以在 Web 层进行延迟加载的操作。

OpenSessionInViewFilter 过滤器将 Hibernate Session 绑定到请求线程中,它将自动被 Spring 的事务管理器探测到。所以 OpenSessionInViewFilter 适用于 Service 层使用HibernateTransactionManager 或 JtaTransactionManager 进行事务管理的环境,也可以用于非事务只读的数据操作中。

要启用这个过滤器,必须在 web.xml 中对此进行配置:

 

…<filter> <filter-name>hibernateFilter</filter-name> <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class></filter><filter-mapping> <filter-name>hibernateFilter</filter-name> <url-pattern>*.html</url-pattern></filter-mapping>…

 

上面的配置,我们假设使用 .html 的后缀作为 Web 框架的 URL 匹配模式,如果您使用 Struts 等 Web 框架,可以将其改为对应的“*.do”模型。

中文乱码过滤器

在您通过表单向服务器提交数据时,一个经典的问题就是中文乱码问题。虽然我们所有的 JSP 文件和页面编码格式都采用 UTF-8,但这个问题还是会出现。解决的办法很简单,我们只需要在 web.xml 中配置一个 Spring 的编码转换过滤器就可以了:

 

<web-app><!---listener的配置--><filter> <filter-name>encodingFilter</filter-name> <filter-class> org.springframework.web.filter.CharacterEncodingFilter ① Spring 编辑过滤器 </filter-class> <init-param> ② 编码方式 <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> ③ 强制进行编码转换 <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> ② 过滤器的匹配 URL <filter-name>encodingFilter</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping><!---servlet的配置--></web-app>

 

这样所有以 .html 为后缀的 URL 请求的数据都会被转码为 UTF-8 编码格式,表单中文乱码的问题就可以解决了。

请求跟踪日志过滤器

除了以上两个常用的过滤器外,还有两个在程序调试时可能会用到的请求日志跟踪过滤器,它们会将请求的一些重要信息记录到日志中,方便程序的调试。这两个日志过滤器只有在日志级别为 DEBUG 时才会起作用:

方法 说明

 

org.springframework.web.filter.ServletContextRequestLoggingFilter

 

该过滤器将请求的 URI 记录到 Common 日志中(如通过 Log4J 指定的日志文件);

 

org.springframework.web.filter.ServletContextRequestLoggingFilter

 

该过滤器将请求的 URI 记录到 ServletContext 日志中。

 

以下是日志过滤器记录的请求跟踪日志的片断:

 

(JspServlet.java:224) - JspEngine --> /htmlTest.jsp(JspServlet.java:225) - ServletPath: /htmlTest.jsp(JspServlet.java:226) - PathInfo: null(JspServlet.java:227) - RealPath: D:\masterSpring\chapter23\webapp\htmlTest.jsp(JspServlet.java:228) - RequestURI: /baobaotao/htmlTest.jsp…

 

通过这个请求跟踪日志,程度调试者可以详细地查看到有哪些请求被调用,请求的参数是什么,请求是否正确返回等信息。虽然这两个请求跟踪日志过滤器一般在程序调试时使用,但是即使程序部署不将其从 web.xml 中移除也不会有大碍,因为只要将日志级别设置为 DEBUG 以上级别,它们就不会输出请求跟踪日志信息了。

转存 Web 应用根目录监听器和 Log4J 监听器

Spring 在 org.springframework.web.util 包中提供了几个特殊用途的 Servlet 监听器,正确地使用它们可以完成一些特定需求的功能。比如某些第三方工具支持通过 ${key} 的方式引用系统参数(即可以通过 System.getProperty() 获取的属性),WebAppRootListener 可以将 Web 应用根目录添加到系统参数中,对应的属性名可以通过名为“webAppRootKey”的 Servlet 上下文参数指定,默认为“webapp.root”。下面是该监听器的具体的配置:

 

 

…<context-param> <param-name>webAppRootKey</param-name> <param-value>baobaotao.root</param-value> ① Web 应用根目录以该属性名添加到系统参数中</context-param>…② 负责将 Web 应用根目录以 webAppRootKey 上下文参数指定的属性名添加到系统参数中<listener> <listener-class> org.springframework.web.util.WebAppRootListener </listener-class></listener>…

 

这样,您就可以在程序中通过 System.getProperty("baobaotao.root") 获取 Web 应用的根目录了。不过更常见的使用场景是在第三方工具的配置文件中通过${baobaotao.root} 引用 Web 应用的根目录。比如以下的 log4j.properties 配置文件就通过 ${baobaotao.root} 设置了日志文件的地址:

 

log4j.rootLogger=INFO,Rlog4j.appender.R=org.apache.log4j.RollingFileAppenderlog4j.appender.R.File=${baobaotao.root}/WEB-INF/logs/log4j.log ① 指定日志文件的地址log4j.appender.R.MaxFileSize=100KBlog4j.appender.R.MaxBackupIndex=1log4j.appender.R.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n

 

另一个专门用于 Log4J 的监听器是 Log4jConfigListener。一般情况下,您必须将 Log4J 日志配置文件以 log4j.properties 为文件名并保存在类路径下。Log4jConfigListener 允许您通过 log4jConfigLocation Servlet 上下文参数显式指定 Log4J 配置文件的地址,如下所示:

 

① 指定 Log4J 配置文件的地址<context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.properties</param-value></context-param>…② 使用该监听器初始化 Log4J 日志引擎<listener> <listener-class> org.springframework.web.util.Log4jConfigListener </listener-class></listener>…

 

 

Spring 所提供的过滤器和监听器 - 本我 - 本我的博客

 

一些Web应用服务器(如 Tomcat)不会为不同的Web应用使用独立的系统参数,也就是说,应用服务器上所有的 Web 应用都共享同一个系统参数对象。这时,您必须通过webAppRootKey 上下文参数为不同Web应用指定不同的属性名:如第一个 Web 应用使用 webapp1.root 而第二个 Web 应用使用 webapp2.root 等,这样才不会发生后者覆盖前者的问题。此外,WebAppRootListener 和 Log4jConfigListener 都只能应用在 Web 应用部署后 WAR 文件会解包的 Web 应用服务器上。一些 Web 应用服务器不会将Web 应用的 WAR 文件解包,整个 Web 应用以一个 WAR 包的方式存在(如 Weblogic),此时因为无法指定对应文件系统的 Web 应用根目录,使用这两个监听器将会发生问题。

 

Log4jConfigListener 监听器包括了 WebAppRootListener 的功能,也就是说,Log4jConfigListener 会自动完成将 Web 应用根目录以 webAppRootKey 上下文参数指定的属性名添加到系统参数中,所以当您使用 Log4jConfigListener 后,就没有必须再使用 WebAppRootListener了。

Introspector 缓存清除监听器

Spring 还提供了一个名为 org.springframework.web.util.IntrospectorCleanupListener 的监听器。它主要负责处理由 JavaBean Introspector 功能而引起的缓存泄露。IntrospectorCleanupListener 监听器在 Web 应用关闭的时会负责清除 JavaBean Introspector 的缓存,在 web.xml 中注册这个监听器可以保证在 Web 应用关闭的时候释放与其相关的 ClassLoader 的缓存和类引用。如果您使用了 JavaBean Introspector 分析应用中的类,Introspector 缓存会保留这些类的引用,结果在应用关闭的时候,这些类以及Web 应用相关的 ClassLoader 不能被垃圾回收。不幸的是,清除 Introspector 的唯一方式是刷新整个缓存,这是因为没法准确判断哪些是属于本 Web 应用的引用对象,哪些是属于其它 Web 应用的引用对象。所以删除被缓存的 Introspection 会导致将整个 JVM 所有应用的 Introspection 都删掉。需要注意的是,Spring 托管的 Bean 不需要使用这个监听器,因为 Spring 的 Introspection 所使用的缓存在分析完一个类之后会马上从 javaBean Introspector 缓存中清除掉,并将缓存保存在应用程序特定的 ClassLoader 中,所以它们一般不会导致内存资源泄露。但是一些类库和框架往往会产生这个问题。例如 Struts 和 Quartz 的 Introspector 的内存泄漏会导致整个的 Web 应用的 ClassLoader 不能进行垃圾回收。在 Web 应用关闭之后,您还会看到此应用的所有静态类引用,这个错误当然不是由这个类自身引起的。解决这个问题的方法很简单,您仅需在 web.xml 中配置 IntrospectorCleanupListener 监听器就可以了:

 

<listener> <listener-class> org.springframework.web.util.IntrospectorCleanupListener </listener-class></listener>

分享到:
评论

相关推荐

    21. Spring Boot过滤器、监听器【从零开始学Spring Boot】

    总结,Spring Boot的过滤器和监听器提供了强大的自定义处理能力,开发者可以根据需求灵活地扩展功能。通过深入理解它们的工作机制,并结合源码阅读,我们可以更高效地利用这些组件,提升应用程序的健壮性和性能。...

    spring+security+11种过滤器介绍.doc

    Spring Security 是一个强大的安全框架,用于管理Web应用的安全性。在Spring Security中,过滤器扮演着核心角色,它们拦截HTTP请求并执行...了解和配置这些过滤器对于理解和定制Spring Security的安全策略至关重要。

    过滤器和监听器收集.pdf

    除了Servlet API提供的过滤器和监听器,有些框架比如Spring MVC还提供了额外的过滤器和监听器。例如,Spring MVC的HandlerInterceptor接口允许在请求处理的不同阶段进行拦截,而它的ContextLoaderListener负责加载...

    过滤器 spring4.1+jdk1.8版本

    本资源提供了基于Spring 4.1和Java 8 (JDK1.8) 的过滤器实现,包括必要的jar包和实例代码,这对于理解如何在实际项目中使用过滤器具有很高的参考价值。 首先,我们需要了解过滤器的基本工作原理。过滤器是实现了 ...

    三歪教你学习过滤器和监听器.zip

    "三歪教你学习过滤器和监听器.zip"包含了多个与Java相关的教程,包括Java集合、多线程、Spring、Servlet、JSP、排序和数据结构、HTTP以及Mybatis等基础和进阶内容,这为全面理解过滤器和监听器提供了扎实的基础。...

    spring boot设置过滤器、监听器及拦截器的方法

    主要给大家介绍了关于spring boot设置过滤器、监听器及拦截器的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

    springcloud gateway 全局过滤器统一签名判定.doc

    在Spring Cloud Gateway中,全局过滤器(Global Filter)是一种强大的机制,用于在请求路由到具体的服务之前或之后执行通用的处理逻辑。在这个场景中,我们关注的是如何利用全局过滤器来实现统一的签名验证,这在...

    spring监听器

    综上所述,Spring监听器和过滤器是Spring Web框架中不可或缺的部分,它们在处理Web请求、管理事务、统一编码、日志记录以及环境配置等方面发挥着重要作用。理解并熟练掌握这些技术,对于构建高质量的Web应用程序至关...

    javaEE(上下文_监听器_过滤器) ppt

    综上所述,Java EE的上下文、监听器和过滤器是构建高效、可维护的Web应用的关键技术,它们提供了一种灵活的方式来管理和控制应用的行为,以适应不断变化的业务需求。理解并熟练运用这些概念,将使开发者能够更好地...

    SpringBoot实现拦截器、过滤器、监听器过程解析

    SpringBoot 框架中提供了多种方式来拦截和过滤请求,包括拦截器、过滤器和监听器。以下是对这三种机制的详细解析: 一、拦截器 在 SpringBoot 中,拦截器是通过实现 HandlerInterceptor 接口来实现的。拦截器可以...

    监听器 过滤器 详解

    在Java Web开发中,监听器...通过阅读《监听器.pdf》和《过滤器.pdf》这两份文档,你应该能够深入理解监听器和过滤器的工作机制,并掌握它们在实际项目中的应用技巧。不断实践和总结,你将在Java Web开发领域更加熟练。

    spring 所需要的jar包

    6. **spring-web**: 为Web应用提供了基础支持,包括HTTP请求的处理、Servlet监听器和过滤器。它还提供了与Spring MVC相关的类,使得创建RESTful服务变得简单。 7. **spring-webmvc**: Spring MVC是Spring框架的一...

    完整版Java web开发教程PPT课件 Java开发进阶教程 第10章 过滤器、监听器、自定义标签(共19页).pptx

    Java Web开发是构建基于Web的应用...例如,Spring MVC中的拦截器(Interceptor)就是对过滤器概念的一种扩展,提供了更丰富的请求处理和响应构建功能。在实际开发中,这些技术常常结合使用,以实现复杂的企业级应用。

    java字符编码监听器

    在Java Servlet规范中,提供了`SetCharacterEncodingFilter`这样的过滤器,用于确保请求参数和响应内容的正确编码,避免因为编码不一致导致的数据乱码问题。 1. **字符编码的重要性** 在网络通信中,字符编码扮演...

    浅析JAVA中过滤器、监听器、拦截器的区别

    与过滤器和监听器不同,拦截器更多地用于框架层面上,如Spring、Hibernate、Struts2等。拦截器的作用是拦截框架中的方法调用或Web请求,并在方法或请求执行前后执行特定的代码逻辑。拦截器可以在配置文件中声明,也...

    springboot2集成代码生成器、监听器、过滤器、拦截器、分布式定时任务、pagehelper

    综上所述,Spring Boot 2提供的集成能力使得开发者可以便捷地引入各种组件,提升开发效率和系统性能。理解并掌握这些集成方式,对于构建高效、稳定的Spring Boot应用至关重要。在实际项目中,可以根据需求选择合适的...

    spring_springweb_

    1. **安全链路(Security Chain)**:所有请求都会通过一系列的安全过滤器,这些过滤器构成了安全链路,每个过滤器执行特定的任务,如认证、授权等。 2. **认证(Authentication)**:识别用户身份的过程。Spring ...

    spring security3 开发手册

    在Spring Security中管理会话也是重要的安全措施之一,包括添加监听器、过滤器以及定义控制策略。 #### 基本认证(basic auth) 基本认证是HTTP协议中的一种认证方式,Spring Security提供了相应的配置方法和编程...

    spring4.2.0对应jdk1.8spring,springMVC所有依赖包以及文档

    在JavaWeb开发中,Spring框架是一个至关重要的组件,它提供了丰富的功能来简化应用程序的构建,尤其是在服务层和表现层的整合上。Spring 4.2.0是该框架的一个稳定版本,它支持Java Development Kit(JDK)1.8,这...

Global site tag (gtag.js) - Google Analytics