Servlet过滤器(Filter)介于与之相关的Servlet和或sp页面和客户之间,即:客户端—》Filter—》servlet或jsp。在《Servlet和JSP的关系以及此关系在Tomcat中的》中已简阐述了servlet和jsp的关系。本篇简要介绍下Filter的作用、对比下它与Servlet的创建过程以及Filter的简单使用!
开发web application 经常会遇到如下情况:
1、访问特定资源(Web 页、JSP 页、servlet)时的身份认证 2、应用程序级的访问资源的审核和记录 3、应用程序范围内对资源的加密访问,它建立在定制的加密方案基础上 4、对被访问资源的及时转换, 包括从 servlet 和 JSP 的动态输出
而这些就是Filter能够处理的事情了,也由此我们可以将Filter分为如下几类:
1、用户授权的Filter:Filter负责检查用户请求,根据请求过滤用户非法请求。 2、日志Filter:详细记录某些特殊的用户请求。 3、负责解码的Filter:包括对非标准编码的请求解码。 4、能改变XML内容的XSLT Filter等。
通过上述介绍我们可以看出,Filter是个典型的处理链,它可以执行servlet之前和之后进行一番处理,并且可以有多个Filter配套使用。而它是在servlet2.3中提出的,其创建和使用过程与Servlet的创建和使用过程类似!分别包括如下两个过程:
servlet:1、创建servlet处理类(一般要实现doGet、doPost或service方法);2、配置web.xml文件(配置servlet标签和servlet-mapping标签)
Filter: 1、创建Filter处理类(要实现init、doFilter和destroy方法); 2、配置web.xml文件(配置filter标签和filter-mapping标签)
servlet举例参见《Servlet和JSP的关系以及此关系在Tomcat中的》,下面简单举例Filter,实现在访问jsp时设置字符集。
Filter处理类代码如下:
package com.bjpowernode.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 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // TODO Auto-generated method stub //设置字符集 servletRequest.setCharacterEncoding(encoding); System.out.println("CharsetEncodingFilter.doFilter---->begin"); //继续执行 filterChain.doFilter(servletRequest, servletResponse); System.out.println("CharsetEncodingFilter.doFilter---->end"); } @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub //取得初始化参数 this.encoding=filterConfig.getInitParameter("encoding"); System.out.println("CharsetEncodingFilter.init()--->encoding="+encoding); } }
filter配置如下:
<?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>CharsetEncodingFilter</filter-name> <filter-class>com.bjpowernode.drp.util.filter.CharsetEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GB18030</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharsetEncodingFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> </web-app>
其调用过程如下图所示:
通过上述介绍,可以清楚filter可以在访问jsp或servlet之前和之后做一些事情。其实质是拦截了request和response两个请求,具体操作可以参见上述代码
中的27-31行。filter的优点除了可以解决上述面临的问题外,还有一点是做软件值得借鉴的地方,这便是filter是可“插拔的”,只需要对配置文件进行更改不
需要改动其他代码,便可以决定使用filter与否和一些参数等的设置非常灵活!