Servlet和JSP过滤器是一种用在servlet和jsp编程中的java类,其使用目的如下:
(一)在客户访问后台资源之前拦截客户请求
(二)在资源被送到客户端之前加以控制
规范所建议的过滤器有多种:
(一)验证类过滤器
(二)数据压缩类过滤器
(三)加密过滤器
(四)触发事件类过滤器
(五)图片转换类过滤器
(六)日志记录和监听过滤器
(七)MIME-TYPE Chain类过滤器
(八)令牌类过滤器
(九)转换XML内容的XSL/T过滤器
过滤器需要部署在描述文件web.xml中,可以映射到所写应用的servlet、jsp页面或其它特定URL上。部署描述文件web.xml可以在web应用的WEB-INF目录下找到。
在JSP容器启动web应用时,它会自动把你在部署描述符中声明的每一个过滤器创建一个实例。过滤器执行的顺序和你在web.xml中声明的顺序一致。
过滤器对象中的方法
过滤器只是一个实现了javax.servlet.Filter接口的简单java类。接口javax.servlet.Filter定义了3个方法:
序号 | 方法& 描述 |
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) |
2 | public void init(FilterConfig filterConfig) |
3 | public void destroy() |
过滤器示例
以下示例的作用是,在客户端每次访问JSP页面时,控制台会打印出客户的ip地址和访问时间。通过此例,我们可以对过滤器有基本的理解,之后你将可以试着写出更复杂的过滤器应用。
|
像编译普通java类一样编译LogFilter.java,然后将编译后的字节码文件LogFilter.class放入web应用的/WEB-INF/classes目录下。
在web.xml中配置过滤器
把定义好的过滤器映射到某个URL或JSP文件上,和在web.xml中配置servlet一样。在web.xml中创建如下的filter标签:
|
以上配置将应用到所有servlet和jsp,因为/*匹配所有文件。当然,你也可以将过滤器应用在某一个(些)servlet或jsp文件上。
现在访问任一servlet或jsp,你将会在web服务器日志中看到输出在控制台中的日志。你可以使用Log4j把日志保存在一个单独的文件中。
分别是:filter和filter-mapping。filter元素向系统注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL。
1.filter元素
filter元素位于部署描述符文件(web.xml)的前部,所有filter-mapping、servlet或servlet-mapping元素之前。filter元素具有如下六个可能的子元素:
:icon 这是一个可选的元素,它声明IDE能够使用的一个图象文件。
:filter-name 这是一个必需的元素,它给过滤器分配一个选定的名字。
:display-name 这是一个可选的元素,它给出IDE使用的短名称。
:description 这也是一个可选的元素,它给出IDE的信息,提供文本文档。
:filter-class 这是一个必需的元素,它指定过滤器实现类的完全限定名。
:init-param 这是一个可选的元素,它定义可利用FilterConfig的getInitParameter方法读取的初始化参数。单个过滤器元素可包含多个init-param元素。
2.filter-mapping元素
filter-mapping元素位于web.xml文件中filter元素之后serlvet元素之前。它包含如下三个可能的子元素::
:filter-name 这个必需的元素必须与用filter元素声明时给予过滤器的名称相匹配。
:url-pattern 此元素声明一个以斜杠(/)开始的模式,它指定过滤器应用的URL。所有filter-mapping元素中必须提供url-pattern或 servlet-name。但不能对单个filter-mapping元素提供多个url-pattern元素项。如果希望过滤器适用于多个模式,可重复整个filter-mapping元素。
:servlet-name 此元素给出一个名称,此名称必须与利用servlet元素给予servlet或JSP页面的名称相匹配。不能给单个filter-mapping元素提供 多个servlet-name元素项。如果希望过滤器适合于多个servlet名,可重复这个filter-mapping元素。
使用多个过滤器
对于web应用,根据不同的目的,可以定义不同的过滤器。试想,你定义了两个过滤器:AuthenFilter(验证权限)和LogFilter(记录日志)。处理方式和上面类同,你需要像下面这样创建新的映射:
|
过滤器执行顺序
filter-mapping元素在web.xml中的放置顺序决定了web容器应用各个过滤器的顺序。你可以颠倒filter-mapping元素次序来使过滤器反序执行。
例如,上面的例子会先应用LogFilter然后再应用AuthenFilter,而下面的例子执行顺序则相反:
建立一个过滤器涉及下列五个步骤: 例子: |
建立字符转换过滤器
1.新建-web-过滤器:SetCharacterEncodingFilter
会在web.xml中产生如下代码:
<filter>
<filter-
name>ChangeCodeFilter</filter-
name>
<display-
name>ChangeCodeFilter</display-
name>
<description></description>
<filter-
class>com.cnc.SetCharacterEncodingFilter</filter-
class>
</filter>
<filter-mapping>
<filter-
name>SetCharacterEncodingFilter</filter-
name>
<
url-pattern>/SetCharacterEncodingFilter</
url-pattern>
</filter-mapping>
2.在过滤器的doFilter方法中添加如下代码:
public
void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2)
throws IOException, ServletException {
arg0.setCharacterEncoding(
"UTF-8");
//设定字体编码为UTF-8
arg2.doFilter(arg0, arg1);
// 传递控制到下一个过滤器
}
3.在web.xml中进行部署
在web.xml的过滤器-编辑器中选择:servlet 映射 - 添加 - Faces Servlet
会在web.xml中产生如下代码:
<filter-mapping>
<filter-
name>SetCharacterEncodingFilter</filter-
name>
<servlet-
name>Faces Servlet</servlet-
name>
</filter-mapping>