一、简介
Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
Servlet 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
- 在客户端的请求访问后端资源之前,拦截这些请求。
- 在服务器的响应发送回客户端之前,处理这些响应。
根据规范建议的各种类型的过滤器:
- 身份验证过滤器(Authentication Filters)。
- 数据压缩过滤器(Data compression Filters)。
- 加密过滤器(Encryption Filters)。
- 触发资源访问事件过滤器。
- 图像转换过滤器(Image Conversion Filters)。
- 日志记录和审核过滤器(Logging and Auditing Filters)。
- MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)。
- 标记化过滤器(Tokenizing Filters)。
- XSL/T 过滤器(XSL/T Filters),转换 XML 内容。
二、要点
1、过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明,然后映射到您的应用程序的部署描述符中的 Servlet 名称或 URL 模式。
2、当 Web 容器启动 Web 应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例。
3、
Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。
4、
web.xml 中的 filter-mapping 元素的顺序决定了 Web 容器应用过滤器到 Servlet 的顺序。
若要反转过滤器的顺序,您只需要在 web.xml 文件中反转 filter-mapping 元素即可。
5、
在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。
三、实例(字符编码过滤器)
包含的文件:
CharacterEncodingFilter.java //继承了Filter的过滤器
web.xml //声明filter,servlet及对应的映射
EncodingFilterServlet.java //servlet文件,用来接受和打印数据
encodingfliter.jsp //表单文件,发送数据到
EncodingFilterServlet.java
中
CharacterEncodingFilter.java
package
com.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;
/*
* 类描述 字符编码过滤器
* 类功能 所以处理的中文数据经过统一
utf
-8编码后输出;
*/
public
class
CharacterEncodingFilter
implements
Filter{
//字符编码格式参数
protected
String
encoding
=
null
;
//FilterConfig对象
protected
FilterConfig
filterConfig
=
null
;
@Override
//初始化方法
public
void
init(FilterConfig filterConfig)
throws
ServletException {
//对filterConfig赋值
this
.
filterConfig
= filterConfig;
//对初始化参数赋值
this
.
encoding
= filterConfig.getInitParameter(
"encoding"
);
}
@Override
public
void
doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws
IOException, ServletException {
//判断字符串是否有效
if
(
encoding
!=
null
){
//设置request字符编码
request.setCharacterEncoding(
encoding
);
//设置response字符编码
response.setContentType(
"text/html;charset="
+
encoding
);
}
//传递下一个过滤器
chain.doFilter(request, response);
}
@Override
public
void
destroy() {
//释放资源
this
.
encoding
=
null
;
this
.
filterConfig
=
null
;
}
}
web.xml
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
web-app
xmlns:xsi
=
"
http://www.springmodules.org/schema/cache/springmodules-cache.xsd
http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd
http://www.w3.org/2001/XMLSchema-instance"
;
xmlns
=
"
http://java.sun.com/xml/ns/javaee"
;
xsi:schemaLocation
=
"
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
;
version
=
"3.0"
>
<
display-name
>
servlet_spot2
</
display-name
>
<
welcome-file-list
>
<
welcome-file
>
index.html
</
welcome-file
>
<
welcome-file
>
index.htm
</
welcome-file
>
<
welcome-file
>
index.jsp
</
welcome-file
>
<
welcome-file
>
default.html
</
welcome-file
>
<
welcome-file
>
default.htm
</
welcome-file
>
<
welcome-file
>
default.jsp
</
welcome-file
>
</
welcome-file-list
>
<!-- 设置字符串编码过滤器 -->
<
filter
>
<
filter-name
>
CharacterEncodingFilter
</
filter-name
>
<
filter-class
>
com.filter.CharacterEncodingFilter
</
filter-class
>
<!-- 设置初始化参数 -->
<
init-param
>
<
param-name
>
encoding
</
param-name
>
<
param-value
>
UTF-8
</
param-value
>
</
init-param
>
</
filter
>
<!-- 映射字符编码过滤器 -->
<
filter-mapping
>
<
filter-name
>
CharacterEncodingFilter
</
filter-name
>
<!-- 与所以请求关联 -->
<
url-pattern
>
/*
</
url-pattern
>
<!-- 设置过滤器对应请求方式 -->
<
dispatcher
>
REQUEST
</
dispatcher
>
<
dispatcher
>
FORWARD
</
dispatcher
>
</
filter-mapping
>
<
servlet
>
<
servlet-name
>
EncodingFilterServlet
</
servlet-name
>
<
servlet-class
>
com.filter.EncodingFilterServlet
</
servlet-class
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>
EncodingFilterServlet
</
servlet-name
>
<
url-pattern
>
/encoding
</
url-pattern
>
</
servlet-mapping
>
</
web-app
>
EncodingFilterServlet.java
package com.filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class EncodingFilterServlet
*/
@WebServlet("/EncodingFilterServlet")
public class EncodingFilterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public EncodingFilterServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
if(name!=null && !name.isEmpty()){
out.print("你好!"+name);
out.print("<br>");
}else{
out.print("请输入你的姓名!");
}
out.flush();
out.close();
}
}
encodingfliter.jsp
<%@
page
language
=
"java"
contentType
=
"text/html; charset=ISO-8859-1"
pageEncoding
=
"ISO-8859-1"
%>
<!
DOCTYPE
html
PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN"
"
http://www.w3.org/TR/html4/loose.dtd"
;
>
<
html
>
<
head
>
<
meta
http-equiv
=
"Content-Type"
content
=
"text/html; charset=ISO-8859-1"
>
<
title
>
Insert title here
</
title
>
</
head
>
<
body
>
<
form
action
=
"EncodingFilterServlet"
method
=
"post"
>
请输入你的名称:
<
input
type
=
"text"
name
=
"name"
>
<
input
type
=
"submit"
value
=
"提交"
>
</
form
>
</
body
>
</
html
>