像GenericServlet實現Servlet介面的方式去實現Filter介面,實現servlet介面

來源:互聯網
上載者:User

像GenericServlet實現Servlet介面的方式去實現Filter介面,實現servlet介面

編寫Filter的時候,我們需要實現Filter介面,需要去實現init(FilterConfig arg0),doFilter(ServletRequest request, ServletResponse response, FilterChain chain),destroy()等方法,有時候我們並不需要去實現init與destory方法,但又必須在代碼裡面寫上這兩個方法.如果我們不想多寫這個兩個方法,我們可以用一個類去實現Filter介面,在我們開發的時候直接繼承這個類,實現doFilter方法即可.

代碼如下:

 1 package com.zhx.http.filter; 2  3 import java.io.IOException; 4  5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest;10 import javax.servlet.ServletResponse;11 import javax.servlet.http.HttpServletRequest;12 import javax.servlet.http.HttpServletResponse;13 14 /**15  * 16  * @author zhaoxin17  * 自訂的HttpFilter,實現Filter介面,參考自GenericServlet的實現方式18  */19 public abstract class HttpFilter implements Filter,java.io.Serializable {20     21     private static final long serialVersionUID = 1L;22     23     private FilterConfig filterConfig;24 25     /**26      * 該方法由servlet容器進行調用,有且只調用一次27      * 不建議子類直接重寫該方法28      */29     @Override30     public void init(FilterConfig arg0) throws ServletException {31         this.filterConfig = arg0;32         this.init();33     }34     35     /**36      * 供子類重寫的初始化方法,在子類中可以在init()方法中調用getFilterConfig()方法來擷取FilterConfig對象,來擷取初始化參數37      * @throws ServletException38      */39     protected void init() throws ServletException {40         //TODO Auto-generated method stub41     }42     43     /**44      * 供子類調用,來擷取FilterConfig對象45      * @return46      */47     public FilterConfig getFilterConfig() {48         return filterConfig;49     }50     51     /**52      * 該方法由servlet容器調用,不建議之類直接進行重寫53      */54     @Override55     public void doFilter(ServletRequest req, ServletResponse res,56             FilterChain fc) throws IOException, ServletException {57         58         HttpServletRequest request;59         HttpServletResponse response;60         61         try {62             request = (HttpServletRequest)req;63             response = (HttpServletResponse)res;64         } catch (Exception e) {65              throw new ServletException("non-HTTP request or response");66         }67         doFilter(request, response, fc);68     }69     70     /**71      * 該方法由子類必須重寫的過濾方法72      * @param request73      * @param response74      * @param filterChain75      * @throws IOException76      * @throws ServletException77      */78     public abstract void doFilter(HttpServletRequest request, HttpServletResponse response,79             FilterChain filterChain) throws IOException, ServletException;80 81     /**82      * 由servlet容器進行調用83      */84     @Override85     public void destroy() {86         // TODO Auto-generated method stub87 88     }89 90 }

開發的時候我們只需建立一個類,然後去繼承HttpFilter即可.如果有初始化的需要,建議重寫無參的init()方法,如果想在該方法內使用FilterConfig對象,通過調用this.getFilterConfig()方法即可獲得.編寫過濾方法時建議重寫doFilter(HttpServletRequest request, HttpServletResponse response,FilterChain filterChain).該方法的好處是可以直接使用HttpServletRequest,HttpServletResponse,不用自己再去將ServletRequest,ServletResponse對象強制轉換為HttpServletRequest,HttpServletResponse對象.如果有釋放資源等操作的時候,直接重寫destory()方法即可,沒有的話就不用重寫.可以讓代碼看上去更美觀.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.