在Web应用开发中,我们经常使用过滤器截取从客户端发来的请求,做出相应的处理。过滤器可以说是外部进入网站的第一道关卡。
我们可以利用这道关卡做很多事,例如:对数据进行编码;判断用户是否来自可信任的网络;过滤垃圾数据;记录日志;判断客户端浏览器版本;验证用户是否合法等等……
下图用UML时序图简单画了一下filter的基本原理
一、定义过滤器类,必须实现 java.servlet.Filter接口
实现三个方法:
1、init(FilterConfig filterConfig) 初始化过滤器,在Servlet容器(服务器刚启动时,一般为tomcat启动时)创建过滤器实例的时候就会调用该方法,多用于读取web.xml文件中Servlet过滤器的初始化参数
2、doFilter(ServletRequest request,ServletResponse response,FilterChain chain)进行过滤处理,所有过滤处理都在这个方法中实现
这个方法得到调用后,里面重要的一点是要调用chain.doFilter(request,response)方法,来完成对下一个过滤器doFilter(ServletRequest request,ServletResponse response,FilterChain chain))方法的调用,如果没有下一个过滤器,则把客户请求传给相应的web组件
3、destroy() 过滤器销毁 Servlet容器在销毁过滤器实例之前该方法得到调用,以释放占用的资源
二、在web.xml中配置过滤器
首先声明Filter,指定Filter的名字和实现类,如果有参数,需要配置参数。
实例1、字符编码过滤器
package com.jialin.drp.util.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharsetEncodingFilter implements Filter {
private String encoding;
@Override
/**
* 销毁这个过滤器
*/
public void destroy() {
// TODO Auto-generated method stub
System.out.println("销毁过滤器");
}
@Override
/**
* 进行过滤处理,所有过滤处理都在这个方法中实现
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("编码过滤器>>>>begin");
request.setCharacterEncoding(encoding);
chain.doFilter(request, response);
System.out.println("编码过滤器>>>>end");
}
@Override
/**
* 是服务器启动时会创建实例,该方法得到调用
*/
public void init(FilterConfig filterConfig) throws ServletException {
//初始化过滤器,获取初始化参数
this.encoding=filterConfig.getInitParameter("encoding");
System.out.println("初始化过滤器>>>>>encoding="+encoding);
}
}
配置文件:
<filter>
<filter-name>CharsetEncodingFilter</filter-name>
<filter-class>com.jialin.drp.util.filter.CharsetEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CharsetEncodingFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
说明:CharsetEncodingFilter的filter-mapping中,它的url-pattern为*.jsp,这表示对所有jsp都起作用。/servlet/*表示以/servlet/的所有URL将被过滤。如果为/*表示对所有URL的请求过滤