关于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
如果应用中使用了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>