关于J2EE中过滤器的使用
一个执行过滤器的Java 类必须实现javax.servlet.Filter 接口。这一接口含有三个方法:
init(FilterConfig):这是容器所调用的初始化方法。它保证了在第一次 doFilter() 调用前由容器调用。它能获取在web.xml 文件中指定的filter初始化参数。
doFilter(ServletRequest,ServletResponse,FilterChain):这是一个完成过滤行为的方法。它同样是上一个过滤器调用的方法。引入的 FilterChain 对象提供了后续过滤器所要调用的信息。
destroy():容器在销毁过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法。
一个J2EE中的最常见的编码过滤器,这个在spring中已经封装好了(spring-web-2.5.6.jar),下面我将仿效它,做一个过滤器。
首先在web.xml中添加如下片段:
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.yuqiaotech.filter.CharacterEncodingFilter</filter-clas> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
添加实现类CharacterEncodingFilter.java
package org.yuqiaotech.filter.CharacterEncodingFilter; package Time; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public classCharacterEncodingFilter implements Filter { private String encoding; private boolean forceEncoding = false; protected FilterConfig filterConfig; public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig=filterConfig; this.encoding=filterConfig.getInitParameter("encoding"); String value=filterConfig.getInitParameter("forceEncoding"); if(value==null) this.forceEncoding=true; else if(value.equalsIgnoreCase("true")) this.forceEncoding=true; else this.forceEncoding=false; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO 自动生成方法存根 if (forceEncoding || (request.getCharacterEncoding() == null)) { String encoding = selectEncoding(request); if (encoding != null) request.setCharacterEncoding(encoding); } chain.doFilter(request, response); } public void destroy() { // TODO 自动生成方法存根 this.encoding = null; this.filterConfig = null; } }
那么以后只要是客户端像服务器发出请求时都会先经过改过滤器,将其编码方式改为Utf-8
J2EE中实际用法
encodingFilter
<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</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>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
如果应用中使用了OpenSessionInViewFilter,所有打开的session会被保存在一个线程变量里。在线程退出前通过OpenSessionInViewFilter断开这些session。为什么这么做?这主要是为了实现Hibernate的延迟加载功能。基于一个请求一个hibernatesession的原则。spring中对OpenSessionInViewFilter的描述如下:
它是一个Servlet2.3过滤器,用来把一个HibernateSession和一次完整的请求过程对应的线程相绑定。目的是为了实现"OpenSession in View"的模式。它允许在事务提交之后延迟加载显示所需要的对象。
<filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping>