java过滤器——filter的使用和配置

时间:2023-02-15 18:25:34

http://blog.csdn.net/huyuyang6688/article/details/46276529 

http://www.cnblogs.com/mfmdaoyou/p/6743027.html


在做DRP的过程中用到了filter。前几天昌哥和欢姐在小会议室向我们介绍了AOP的思想,用到filter时觉得它们两者特别相似。

       如下图:   

       java过滤器——filter的使用和配置 


       javaweb开发中,request和response是两个必不可少的对象,他们是在接收到每一次客户端请求后,由web服务器产生的。filter可以在request到达servlet之前和response即离开servlet时分别对它们进行处理。

       filter常常用于网站过滤敏感词汇、设置字符集、日志等比较“公共性”的事件处理中。


       在我们正常的编程中,每一条线,都是从上到下依次调用,而filter是在每一个完整的调用中横着“切了一刀”。通过配置,它可以对任意代码路径进行过滤。

  

       这里以转码/设置字符集为例,简单了解一下如何使用filter。

         

       建立Filter


       CharsetEncodingFilter.Java

[java] view plain copy
  1. package com.drp.filter;  
  2.   
  3. import java.io.IOException;  
  4. import javax.servlet.Filter;  
  5. import javax.servlet.FilterChain;  
  6. import javax.servlet.FilterConfig;  
  7. import javax.servlet.ServletException;  
  8. import javax.servlet.ServletRequest;  
  9. import javax.servlet.ServletResponse;  
  10.   
  11. /**采用filter统一处理filter 
  12.  * @author Danny 
  13.  * 
  14.  */  
  15. public class CharsetEncodingFilter implements Filter {  
  16.   
  17.     @Override  
  18.     public void destroy() {}  
  19.   
  20.     @Override  
  21.     public void doFilter(ServletRequest request, ServletResponse response,  
  22.             FilterChain chain) throws IOException, ServletException {  
  23.         System.out.println("CharsetEncodingFilter---->>>>Filter开始");  
  24.         request.setCharacterEncoding("utf-8");    //设置字符集  
  25.         chain.doFilter(request, response);    //继续执行  
  26.                 System.out.println("CharsetEncodingFilter---->>>>Filter结束");  
  27.     }  
  28.   
  29.     @Override  
  30.     public void init(FilterConfig config) throws ServletException {}  
  31.   
  32. }  

       此过滤器CharsetEncodingFilter实现了javax.servlet.Filter接口(任何filter过滤器也必须实现这个接口);在服务器创建此filter并进行初始化执行init方法时,读取配置文件并存入FilterConfigure的对象中;实现doFilter方法,在请求到达jsp之前将字符集编码设置为utf-8,chain.doFiler()方法的作用是在对request对象进行处理之后,跳转到被拦截的servlet继续执行,执行完之后还要回到此处,chain.doFilter()下面还可以对response对象进行处理。


       配置filter


       web.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="3.0"   
  3.     xmlns="http://java.sun.com/xml/ns/javaee"   
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
  6.     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  
  7.   
  8.   <filter>  
  9.     <filter-name>CharsetEncodingFilter</filter-name>  
  10.     <filter-class>com.drp.filter.CharsetEncodingFilter</filter-class>  
  11.   </filter>  
  12.   <filter-mapping><!-- 此filter对所有的jsp页面都有过滤效果 -->  
  13.     <filter-name>CharsetEncodingFilter</filter-name>  
  14.     <url-pattern>*.jsp</url-pattern>  
  15.   </filter-mapping>  
  16. </web-app>  


       此处配置所起的作用是,此filter对所有的jsp页面都有设置字符集的效果,当每次访问jsp页面时,都会执行filter中的doFilter()方法,因此每次访问jsp页面前后,都可以在Console中看到doFilter方法输出的 “ CharsetEncodingFilter---->>>>Begin ” 和 “CharsetEncodingFilter---->>>>End ”。

       除此之外还有其他几种对filter作用域配置的方式:

       对所有的对象都有过滤效果 

[html] view plain copy
  1. <filter-mapping>  
  2.     <filter-name>CharsetEncodingFilter</filter-name>  
  3.     <url-pattern>/*</url-pattern>  
  4. </filter-mapping>  
        对sysmgr下的所有对象都有过滤效果,无论是servlet还是jsp

[html] view plain copy
  1. <filter-mapping>  
  2.     <filter-name>CharsetEncodingFilter</filter-name>  
  3.     <url-pattern>/sysmgr/*</url-pattern>  
  4. </filter-mapping>  
         只对指定的servlet具有过滤效果
[html] view plain copy
  1. <filter-mapping>  
  2.     <filter-name>CharsetEncodingFilter</filter-name>  
  3.     <url-pattern>/servlet/LoginServlet</url-pattern>  
  4. </filter-mapping>  



      至此,无论访问哪个jsp页面,都会事先设置其字符集,不用分别对每个页面都进行设置了。