java filter用法大全

來源:互聯網
上載者:User

關鍵字: filter

    過濾器Filter也具有生命週期:init()->doFilter()->destroy(),由部署檔案中的filter元素驅動。在servlet2.4中,過濾器同樣可以用於請求指派器,但須在web.xml中聲明,<dispatcher>INCLUDE或FORWARD或REQUEST或ERROR</dispatcher>該元素位於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. }  
public class EncodingFilter implements Filter { private String encoding = null; public void destroy() {  encoding = null; } public void doFilter(ServletRequest request, ServletResponse response,   FilterChain chain) throws IOException, ServletException {  String encoding = getEncoding();  if (encoding == null){   encoding = "gb2312";  }  request.setCharacterEncoding(encoding);// 在請求裡設定上指定的編碼  chain.doFilter(request, response); } public void init(FilterConfig filterConfig) throws ServletException {  this.encoding = filterConfig.getInitParameter("encoding"); } private String getEncoding() {  return this.encoding; }}

Xml代碼

  1. <filter>  
  2.     <filter-name>EncodingFilter</filter-name>  
  3.     <filter-class>com.logcd.filter.EncodingFilter</filter-class>  
  4.     <init-param>  
  5.        <param-name>encoding</param-name>  
  6.        <param-value>gb2312</param-value>  
  7.     </init-param>  
  8. </filter>  
  9.   
  10. <filter-mapping>  
  11.    <filter-name>EncodingFilter</filter-name>  
  12.    <url-pattern>/*</url-pattern>  
  13. </filter-mapping>  
<filter>    <filter-name>EncodingFilter</filter-name>    <filter-class>com.logcd.filter.EncodingFilter</filter-class>    <init-param>       <param-name>encoding</param-name>       <param-value>gb2312</param-value>    </init-param></filter><filter-mapping>   <filter-name>EncodingFilter</filter-name>   <url-pattern>/*</url-pattern></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. }  
public void doFilter(ServletRequest request,        ServletResponse response,        FilterChain chain)        throws IOException, ServletException {    HttpServletRequest req = (HttpServletRequest) request;    HttpServletResponse res = (HttpServletResponse) response;    HttpSession session = req.getSession();    if (session.getAttribute("username") != null) {//登入後才能訪問        chain.doFilter(request, response);    } else {        res.sendRedirect("../failure.jsp");    }}
Xml代碼
  1. <filter>  
  2.     <filter-name>SecurityFilter</filter-name>  
  3.     <filter-class>com.logcd.filter.SecurityFilter</filter-class>  
  4. </filter>  
  5. <filter-mapping>  
  6.     <filter-name>SecurityFilter</filter-name>  
  7.     <url-pattern>/admin/*</url-pattern>  
  8. </filter-mapping>  
<filter>    <filter-name>SecurityFilter</filter-name>    <filter-class>com.logcd.filter.SecurityFilter</filter-class></filter><filter-mapping>    <filter-name>SecurityFilter</filter-name>    <url-pattern>/admin/*</url-pattern></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之前,這樣才能確保在使用請求中的資料前設定正確的編碼。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.