1. 程式人生 > >Servlet學習總結(9)過濾器

Servlet學習總結(9)過濾器

定義

        Servlet過濾器從字面上的字意理解為經過一層次的過濾處理才達到使用的要求,而其實Servlet過濾器就是伺服器與客戶端請求與響應的中間層元件,在實際專案開發中Servlet過濾器主要用於對瀏覽器的請求進行過濾處理,將過濾後的請求再轉給下一個資源。總的來說,Servlet的過濾器是通過一個配置檔案來靈活的宣告的模組化可重用元件。過濾器動態的截獲傳入的請求和傳出的響應,在不修改程式程式碼的情況下,透明的新增或刪除他們。其獨立於任何平臺和web容器。

特點

●  宣告式的:通過在web.xml配置檔案中宣告,允許新增、刪除過濾器,而無需改動任何應用程式程式碼或jsp頁面。

●  靈活的:過濾器可用於客戶端的直接呼叫執行預處理和後期的處理工作,通過過濾鏈可以實現一些靈活的功能。

●  可移植的:由於現今各個web容器都是以Servlet的規範進行設計的,因此Servlet過濾器同樣是跨容器的。

●  可重用的:基於其可移植性和宣告式的配置方式,Filter是可重用的。

基本概念

        Filter是在Servlet 2.3之後增加的新功能,當需要限制使用者訪問某些資源或者在處理請求時提前處理某些資源的時候,就可以使用過濾器完成。 

        過濾器是以一種元件的形式繫結到WEB應用程式當中的,與其他的WEB應用程式元件不同的是,過濾器是採用了“鏈”的方式進行處理的。      

        Filter可以應用在客戶端和Servlet之間、servlet和serlvet或jsp之間,以及jsp之間。並且可以通過配置資訊,靈活的使用那個過濾器。

工作原理

        客戶端瀏覽器在訪問web伺服器的某個具體資源的時候,經過過濾器1中code1程式碼塊的相關處理之後,將request請求傳遞給過濾鏈中的下一個過濾器2,(過濾鏈的順序以配置檔案中的順序為基準)過濾器2處理完之後,request就傳遞的Servlet完成相應的邏輯。返回響應的過程類似,只是過濾鏈的順序相反。

 作用

  1. 對伺服器接收的請求和響應給瀏覽器的資源進行管理
  2. 保護Servlet

使用

過濾器定義

在Servlet中,如果要定義一個過濾器,則直接讓一個類實現javax.servlet.Filter介面即可,此介面定義了三個操作方法

  • 實現javax.servlet.Filter介面
  • 實現init方法,讀取過濾器的初始化引數,伺服器啟動執行
  • 實現doFilter方法,完成對請求或響應的過濾
  • 呼叫FilterChain介面物件的doFilter方法,向後續的過濾器傳遞請求或響應(放行請求和響應)
  • 實現destroy方法,伺服器關閉執行
public class MyFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("MyFilter.init(第一個過濾器初始化成功)");

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("MyFilter.doFilter(第一個過濾器執行成功)");
        //設定編碼格式
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");
        //判斷session
        HttpSession hs = ((HttpServletRequest)servletRequest).getSession();
        if (hs.getAttribute("user") == null) {
            ((HttpServletResponse)servletResponse).sendRedirect("/manage/login.jsp");
        }else {
            // 轉發放行到下一個元件,進行後續的處理(元件可以是一個過濾器,也可以是一個servlet)
            filterChain.doFilter(servletRequest,servletResponse);
        }

        System.out.println("MyFilter.doFilter(第一個過濾器執行成功2)");
    }

    @Override
    public void destroy() {
        System.out.println("MyFilter.destroy(第一個過濾器銷燬成功)");

    }
}

 web.xml配置

  <!--配置過濾器
      /*:表示攔截所有請求,包括servlet和jsp
      *.model:表示攔截以do結尾的請求,一般用來進行模組攔截處理
      /servletName:表示攔截指定url請求,針對某個Servlet的請求進行攔截,保護Servlet
  -->
  <filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.mt.filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter>
    <filter-name>myFilter2</filter-name>
    <filter-class>com.mt.filter.MyFilter2</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>myFilter2</filter-name>
    <url-pattern>*.do</url-pattern>
  </filter-mapping>
  <filter>
    <filter-name>myFilter3</filter-name>
    <filter-class>com.mt.filter.MyFilter3</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>myFilter3</filter-name>
    <url-pattern>/NoFilterServlet.do</url-pattern>
  </filter-mapping>

生命週期

        伺服器啟動到伺服器關閉

使用案例

  • 統一編碼格式設定
  • session管理
  • 許可權控制
  • 資源管理(統一水印、敏感詞處理)