在java web中创建过滤器一般步骤如下:
(1)建立一个实现Filter接口的类并定义3个方法:doFilter,init和destory
(2)在doFilter方法中放入过滤行为。doFilter方法的第一个参数为ServletRequest对象,此对象给过滤器提供了对进入的信息(包括表单数据,cookie和HTTP请求头)的完全访问;第二个参数为ServletResponse对象,通常在简单的过滤器中忽略此参数;最后一个参数为FilterChain,如下一步所述,此参数调用Servlet或JSP页面
(3)调用FilterChain对象的doFilter方法,Filter接口的doFilter方法取一个FilterChain对象作为它的一个参数。在调用此对象的doFilter方法时,激活下一个相关过滤器。如果没有另一个过滤器与Servlet或JSP页面被激活。
(4)对相应的Servlet和JSP页面注册过滤器。在部署描述文件(web.xmml)中使用filter和filter-mapping
(5)禁止激活器Servlet。防止用户利用默认的Servlet URL绕过过滤器设置.
以编码过滤器为实例,综合讲解一个过滤器在Java Web 程序中的具体应用
首先编制一个编码过滤器类EncodingFilter.java,然后将编码过滤器EncodingFilter在xml中进行配置,再创建一个发起请求的HTML测试页面index.htm,然后再创建一个用于处理请求的JSP页面process.jsp
一:编码过滤器类EncodingFilter.java
package filter;
import java.io.*;
import javax.servlet.*;
public class EncodingFilter implements Filter {
String encoding = null;
FilterConfig filterConfig = null;
// 初始化方法
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
}
// 过滤器处理方法
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (encoding != null) {
// 对请求进行编码设置
request.setCharacterEncoding(encoding);
}
chain.doFilter(request, response);
}
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
}
二:编码过滤器在web.xml中的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
三:发起请求的HTML测试页面index.htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>编码过滤器测试</title>
<meta http-equiv="content-type" content="text/html;charset=gb2312" >
</head>
<body>
<form action="process.jsp" name ="form1" method="post" >
请输入姓名:<input name ="name" type ="text"/>
<input type="submit" name ="submit" value ="提交"/>
</form>
</body>
</html>
四:处理请求的JSP页面 process.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>编码过滤器测试</title>
</head>
<body>
<%=request.getParameter("name") %>,你好!<br/>
</body>
</html>
通过编码过滤器以后,处理请求的JSP可直接获得正常的中文参数值,无须进行编码的硬性转换,彻底解决了java web中的中文编码问题。