Filter主要作用是拦截用户的请求,对其请求进行预处理,然后将请求交给Servlet进行处理并生成响应,再由Filter对服务器响应进行后处理。
1.创建Filter类
创建 Filter 必须实现 javax.servlet.Filter 接口,在该接口中定义了如下三个方法。
void init(FilterConfig config):用于完成 Filter 的初始化。
void destroy():用于 Filter 销毁前,完成某些资源的回收。
void doFilter(ServletRequest request,ServletResponse response,FilterChain chain):实现过滤功能,该方法就是对每个请求及响应增加的额外处理。
在实现的Filter类doFilter()方法中在调用了chain.doFilter()方法之前,即对用户请求进行预处理;执行该方法之后,即对服务器响应进行后处理。当然,如在预处理时,发现不合格,亦可直接重定向或转发等操作而不必执行该方法,根据情况而定。
2.配置Filter类
Filter配置与Servlet相似,一样有俩种方式可实现:
(1)在 Filter 类中通过 Annotation 进行配置。
(2)在 web.xml 文件中通过配置文件进行配置。
<!-- 定义Filter -->
<filter>
<!-- Filter的名字,相当于指定@WebFilter
的filterName属性 -->
<filter-name>log</filter-name>
<!-- Filter的实现类 -->
<filter-class>lee.LogFilter</filter-class>
</filter>
<!-- 定义Filter拦截的URL地址 -->
<filter-mapping>
<!-- Filter的名字 -->
<filter-name>log</filter-name>
<!-- Filter负责拦截的URL,相当于指定@WebFilter的urlPatterns属性 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
Filter使用最多的是置放一些通用代码,或者进行一些在达到处理之前进行一系列的验证等。
3.使用URL Rewrite实现网站的伪静态
搜索引擎一般都会优先收录html的页面,因此可以将动态页面*.jsp等动态URL伪装成静态的html页面;
对于web应用来说,可以通过Filter拦截所有*.html请求,然后通过规则,将请求转发forward到实际的*.jsp页面即可。 URL Rewrite开源项目正式使用这种思路。
可在web.xml中配置启用URL Rewrite:
<!-- 配置Url Rewrite的Filter -->
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<!-- 配置Url Rewrite的Filter拦截所有请求 -->
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
然后在Web-inf路径下增加urlrewrite.xml文件,该文件定义其伪静态映射规则,规则基于正则表达式。
例子清单:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 3.2//EN"
"http://tuckey.org/res/dtds/urlrewrite3.2.dtd">
<urlrewrite>
<rule>
<!-- 所有配置如下正则表达式的请求 -->
<from>/test-(\w*).html</from>
<!-- 将被forward到如下jsp页面,其中$1代表上面第一个正则表达式所匹配的字符串 -->
<to type="froward">/test.jsp?username=$1</to>
</rule>
</urlrewrite>
这样,地址栏将保留请求的静态html地址,而不是动态的jsp等动态页面地址。