Filter配置和讲解(转)

过滤器Filter也具有生命周期:init()->doFilter()->destroy(),由部署文件中的filter元素驱动。在servlet2.4中,过滤器同样可以用于请求分派器,但须在web.xml中声明,INCLUDE或FORWARD或REQUEST或ERROR该元素位于filter-mapping中。 

一、批量设置请求编码 

Java代码 
  1. public class EncodingFilter implements Filter {   
  2.   
  3.     private String encoding = null;   
  4.   
  5.     public void destroy() {   
  6.          encoding = null;   
  7.      }   
  8.   
  9.     public void doFilter(ServletRequest request, ServletResponse response,   
  10.              FilterChain chain) throws IOException, ServletException {   
  11.          String encoding = getEncoding();   
  12.         if (encoding == null){   
  13.              encoding = "gb2312";   
  14.          }   
  15.          request.setCharacterEncoding(encoding);// 在请求里设置上指定的编码   
  16.          chain.doFilter(request, response);   
  17.      }   
  18.   
  19.     public void init(FilterConfig filterConfig) throws ServletException {   
  20.         this.encoding = filterConfig.getInitParameter("encoding");   
  21.      }   
  22.   
  23.     private String getEncoding() {   
  24.         return this.encoding;   
  25.      }   
  26.   
  27.  
[java]  view plain copy
  1. public class EncodingFilter implements Filter  
  2.   
  3.  private String encoding null 
  4.   
  5.  public void destroy()  
  6.   encoding null 
  7.   
  8.   
  9.  public void doFilter(ServletRequest request, ServletResponse response,  
  10.    FilterChain chain) throws IOException, ServletException  
  11.   String encoding getEncoding();  
  12.   if (encoding == null){  
  13.    encoding "gb2312" 
  14.    
  15.   request.setCharacterEncoding(encoding);// 在请求里设置上指定的编码  
  16.   chain.doFilter(request, response);  
  17.   
  18.   
  19.  public void init(FilterConfig filterConfig) throws ServletException  
  20.   this.encoding filterConfig.getInitParameter("encoding");  
  21.   
  22.   
  23.  private String getEncoding()  
  24.   return this.encoding;  
  25.   
  26.   
  27.  

 

Xml代码 
  1. <</span>filter>  
  2.     <</span>filter-name>EncodingFilter</</span>filter-name>  
  3.     <</span>filter-class>com.logcd.filter.EncodingFilter</</span>filter-class>  
  4.     <</span>init-param>  
  5.        <</span>param-name>encoding</</span>param-name>  
  6.        <</span>param-value>gb2312</</span>param-value>  
  7.     </</span>init-param>  
  8. </</span>filter>  
  9.   
  10. <</span>filter-mapping>  
  11.    <</span>filter-name>EncodingFilter</</span>filter-name>  
  12.    <</span>url-pattern>/*</</span>url-pattern>  
  13. </</span>filter-mapping>  
[xml]  view plain copy
  1. <</span>filter>  
  2.     <</span>filter-name>EncodingFilter</</span>filter-name>  
  3.     <</span>filter-class>com.logcd.filter.EncodingFilter</</span>filter-class>  
  4.     <</span>init-param>  
  5.        <</span>param-name>encoding</</span>param-name>  
  6.        <</span>param-value>gb2312</</span>param-value>  
  7.     </</span>init-param>  
  8. </</span>filter>  
  9.   
  10. <</span>filter-mapping>  
  11.    <</span>filter-name>EncodingFilter</</span>filter-name>  
  12.    <</span>url-pattern>/*</</span>url-pattern>  
  13. </</span>filter-mapping>  


二、用filter控制用户访问权限 

Java代码 
  1. public void doFilter(ServletRequest request,   
  2.          ServletResponse response,   
  3.          FilterChain chain)   
  4.         throws IOException, ServletException {   
  5.   
  6.      HttpServletRequest req = (HttpServletRequest) request;   
  7.      HttpServletResponse res = (HttpServletResponse) response;   
  8.   
  9.      HttpSession session = req.getSession();   
  10.     if (session.getAttribute("username") != null) {//登录后才能访问   
  11.          chain.doFilter(request, response);   
  12.     else {   
  13.          res.sendRedirect("../failure.jsp");   
  14.      }   
  15.  
[java]  view plain copy
  1. public void doFilter(ServletRequest request,  
  2.         ServletResponse response,  
  3.         FilterChain chain)  
  4.         throws IOException, ServletException  
  5.   
  6.     HttpServletRequest req (HttpServletRequest) request;  
  7.     HttpServletResponse res (HttpServletResponse) response;  
  8.   
  9.     HttpSession session req.getSession();  
  10.     if (session.getAttribute("username"!= null{//登录后才能访问  
  11.         chain.doFilter(request, response);  
  12.     else  
  13.         res.sendRedirect("../failure.jsp");  
  14.      
  15.  


Xml代码 
  1. <</span>filter>  
  2.     <</span>filter-name>SecurityFilter</</span>filter-name>  
  3.     <</span>filter-class>com.logcd.filter.SecurityFilter</</span>filter-class>  
  4. </</span>filter>  
  5. <</span>filter-mapping>  
  6.     <</span>filter-name>SecurityFilter</</span>filter-name>  
  7.     <</span>url-pattern>/admin/*</</span>url-pattern>  
  8. </</span>filter-mapping>  
[xml]  view plain copy
  1. <</span>filter>  
  2.     <</span>filter-name>SecurityFilter</</span>filter-name>  
  3.     <</span>filter-class>com.logcd.filter.SecurityFilter</</span>filter-class>  
  4. </</span>filter>  
  5. <</span>filter-mapping>  
  6.     <</span>filter-name>SecurityFilter</</span>filter-name>  
  7.     <</span>url-pattern>/admin/*</</span>url-pattern>  
  8. </</span>filter-mapping>  


三、过滤链 

   两个过滤器,EncodingFilter负责设置编码,SecurityFilter负责控制权限,服务器会按照web.xml中过滤器定义的先后循序组装成一条链,然后一次执行其中的doFilter()方法。执行的顺序就如上图所示,执行第一个过滤器的chain.doFilter()之前的代码,第二个过滤器的chain.doFilter()之前的代码,请求的资源,第二个过滤器的chain.doFilter()之后的代码,第一个过滤器的chain.doFilter()之后的代码,最后返回响应。 
执行的代码顺序是:

  1. 执行EncodingFilter.doFilter()中chain.doFilter()之前的部分:request.setCharacterEncoding("gb2312");
  2. 执行SecurityFilter.doFilter()中chain.doFilter()之前的部分:判断用户是否已登录。
  3. 如果用户已登录,则访问请求的资源:/admin/index.jsp。
  4. 如果用户未登录,则页面重定向到:/failure.jsp。
  5. 执行SecurityFilter.doFilter()中chain.doFilter()之后的部分:这里没有代码。
  6. 执行EncodingFilter.doFilter()中chain.doFilter()之后的部分:这里也没有代码。


   过滤链的好处是,执行过程中任何时候都可以打断,只要不执行chain.doFilter()就不会再执行后面的过滤器和请求的内容。而在实际使用时,就要特别注意过滤链的执行顺序问题,像EncodingFilter就一定要放在所有Filter之前,这样才能确保在使用请求中的数据前设置正确的编码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值