1. Filter介绍
过滤器就是一个类似于Servlet的由容器管理对象,它能够以声明的方式插入到HTTP请求响应的过程中,过滤器是J2EE Web应用程序中应用级别的Java代码组件。除了Servlet和JSP页面以外,遵循Servlet 2.3以上规范编码的开发人员能将过滤器作为在Web应用程序中加入活动活动行为的机制。与在特定的URL上工作的Servlet和JSP页面不同,过滤器接入J2EE容器的处理管道,并能够跨由Web应用程序提供的URL子集进行工作。
2. Filter的功能
1)在一个Servlet被调用前截获该调用
2)在一个Servlet被调用前检查请求
3)修改在实际请求中提供了可定制请求对象的请求头和请求数据
4)修改在实际响应中提供了可定制响应对象的响应头和响应数据
5)在一个Servlet被调用之后截获该调用
6)过滤的应用包含授权、日志、图像转换、数据压缩、加密、表示流及XML转换。另外在Servlet 2.4的规范中,增加了一个新的技术,就是可以在视图派发器下执行过滤操作。
3. Filter的生命周期
实例化:在访问Web资源创建过滤器的实例
初始化:容器在调用过滤器的doFilter()方法之前调用init()方法。Web容器使用FilterConfig对象作为init()方法的参数将配置信息发送给过滤器。
过滤:每当用户提交请求或Web资源发送响应时,调用doFilter()方法。
销毁:在停止使用过滤器之前,由容器调用过滤器的destroy()方法,允许过滤器完成必要的清除和释放资源。
4. 过滤器API(以下是翻译J2EE 1.5 API的部分片段)
与过滤器相关的API在javax.servlet这个包中,其中包含了Filter、FilterChain、FilterConfig这三个接口
Filter中的方法有:
void destroy() 这个方法有Web容器调用以表示过滤正在从服务中销毁
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 在每次客户端请求资源最后时刻,传递过来的请求和响应时,由容器调用这个方法。
void init(FilterConfig filterConfig) 由容器调用表示过滤器正在初始化。
FilterChain中的方法有:
void doFilter(ServletRequest request, ServletResponse response) 调用这个方法将导致在整个过滤器链的下一个过滤器被调用,或者如果这个过滤器是整个过滤器的最后一个过滤器,那么资源将被调用。
FilterConfig的方法有:
String getFilterName() 返回这个在部署文件描述(web.xml)中定义的过滤器的名字
String getInitParameter(String name) 返回以name命名的初始化参数的字符串类型的值,如果这个参数不存在,那么返回空。
Enumeration getInitParameterNames() 返回过滤器所有初始化参数名字的一个枚举,如果没有参数存在,那么返回空枚举。
ServletContext getServletContext() 返回Servlet上下文。
5. 过滤器示例
/*=======CharFilter.java========*/
package com.filter;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CharFilter implements Filter {
String charSet = null;
@Override
public void destroy() {
System.out.println("正在销毁过滤器。。。");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain filterChain) throws IOException, ServletException {
System.out.println("正执行字符过滤。。。");
HttpServletRequest hreq = (HttpServletRequest) req;
HttpServletResponse hres = (HttpServletResponse) res;
hreq.setCharacterEncoding(charSet);
hres.setCharacterEncoding(charSet);
filterChain.doFilter(hreq, hres);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("正在获取字符过滤器初始化,获取初始化参数。。。");
charSet = filterConfig.getInitParameter("charSet");
String filterName = filterConfig.getFilterName();
Enumeration nameEnum = filterConfig.getInitParameterNames();
ServletContext sc = filterConfig.getServletContext();
System.out.println("charSet: " + charSet);
System.out.println("filterName: " + filterName);
while (nameEnum.hasMoreElements()) {
System.out
.println("nameEnum: " + nameEnum.nextElement().toString());
}
if (charSet == null) {
charSet = "GBK";
}
}
}
/*=========过滤器的配置=========*/
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>charFilter</filter-name>
<filter-class>com.filter.CharFilter</filter-class>
<init-param>
<param-name>charSet</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>charFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>