1.Filter可认为是Servlet的一种加强版,使用Filter完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet处理并生成相应,最后Filter再对服务器响应进行后处理。
2.创建一个Filter需要两个步骤:
⑴创建Filter处理类,必须实现javax.Servlet.Filter接口,重写三个方法
void init(FilterConfig config):用于完成Filter的初始化;
void destroy():用于Filter销毁前,完成某些资源的回收;
void doFilter(ServletRequest request,ServletResponse response,Filterchain chain);
实现过滤功能,该方法就是对每个请求以及响应增加的额外处理;
Filter处理类源代码:
public class FilterClass implements Filter{
private FilterConfig config;
public void init(FilterConfig config){
this.config=config;
}
public void destroy(){
this.config=null;
}
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServletException{
ServletContext context=this.config.getServletContext();
long before=System.currentTimeMillis();
System.out.println("开始过滤。。。");
HttpServletRequest hsrrequest=(HttpServletRequest)request;
System.out.println("Filter已经截获的用户请求的地址:"+hsrrequest.getServletPath());
chain.doFilter(request, response);
long after=System.currentTimeMillis();
System.out.println("过滤结束,请求被定为到:"+hsrrequest.getRequestURI()+"所花时间为"+(after-before));
}
}
⑵配置Filter:
Annotation方式:@WebFilter(filterName="state" urlPatterns={"/*"}).
web.xml方式:
<filter>
<filter-name>state</filter-name>
<filter-class>Filter.FilterClass</filter-class>
</filter>
<filter-mapping>
<filter-name>state</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在Filter配置中的url元素,/*表示Filter会拦截所有用于请求,所以在Web项目中新建任意一个jsp,访问该jsp即可测试Filter。
测试结果:
3.Filter处理类中的doFilter()方法用于对用户的请求进行预处理和对服务器的响应进行后处理,两者的界线在于
chain.doFilter(request, response);该方法表示将用户请求继续提交给服务器,执行该方法前表示对用户请求进行预处理,执行该方法后表示对服务器响应进行后处理。
4.Filter和Servlet极其相似,区别只是Filter的doFilter()方法中多了一个chain参数,该参数用于控制是否放行用户请求。通常Filter中的doFilter()方法的代码是多个Servlet的Service()方法中抽取的通用代码,比如字符编码的设置,检查用户的请求,通过Filter可以更好的实现代码的复用。
5.检查用户请求Filter实例:(该Filter用于检查JSP表单提交请求,若用户名或者密码为空,则跳转到错误提示JSP页面,都不为空则跳转到成功登录页面)
Filter处理类源代码:
public class FilterTest implements Filter{
private FilterConfig config;
public void init(FilterConfig config){
this.config=config;
}
public void destroy(){
this.config=null;
}
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException,ServletException{
HttpServletRequest hsrrequest=(HttpServletRequest)request;
if(hsrrequest.getParameter("username").equals("")||hsrrequest.getParameter("password").equals("")){
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
else{
chain.doFilter(request, response);
}
}
}
该Filter用于检验用户的表单提交请求,如果用户名或者密码有一个为空,则跳转到错误页面jsp,否则继续提交给正常登录页面。
web.xml中配置该Filter:
<filter>
<filter-name>user</filter-name>
<filter-class>Filter.FilterTest</filter-class>
</filter>
<filter-mapping>
<filter-name>user</filter-name>
<url-pattern>/login.jsp</url-pattern>
</filter-mapping>
JSP运行结果:
当输入用户名和密码为空时:
当输入正确的用户名和密码时:
6.Filter还可以用于实现网站伪静态。大部分搜索引擎都会优先考虑收录静态的html页面,而不是动态的jsp或者php页面,所以可以将jsp,php页面伪装成静态的html页面,可以通过Filter拦截所有发向*.html请求,然后forward到对应的*.jsp页面即可。可以使用URL Rewrite实现。
步骤:
⑴下载urlrewritefilter-4.0.3.jar,放入web项目的WEB-INF/lib下
⑵配置Filter:
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</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>/(\w*).html</from>
<!-- 将被forward到如下JSP页面-->
<to type="forward">/$1.jsp</to>
</rule>
</urlrewrite>
如上所示,所以发向html页面的请求,都会被forward到相同名字的jsp页面,即将jsp页面伪装成了html页面。
运行结果:
在地址栏中访问hello.html,实际上是访问hello.jsp
源代码和jar包下载地址: http://pan.baidu.com/s/1ntC2C7v