1. 程式人生 > 其它 >Java Web的三大元件之一Filter過濾器實現原理例項講解

Java Web的三大元件之一Filter過濾器實現原理例項講解

Filter

Servlet, Filter, Listener稱為Java Web的三大元件

Filter: 過濾器

當瀏覽器訪問伺服器資源時和響應返回時,過濾器可以將請求攔截下來,完成一些特殊功能

用途:一般用於完成通用操作:如登入驗證,統一編碼處理,敏感字元過濾…

1. Filter實現

  1. 定義一個類,實現Filter介面
  2. 覆寫方法
  3. 配置攔截路徑
    1. 配置WEB-INF中的xml
    2. 用註解配置路徑:@WebFilter(urlPatterns=””)或@WebFilter(value=””)或@WebFilter(””)

2. Filter原理

  1. Filter執行流程
    1. 請求過濾:執行放行doFilter上的程式碼
    2. 放行:執行doFilter,攔截的資源被執行
    3. 響應過濾:攔截的資源做出響應後,回來執行doFilter下邊的程式碼
  1. Filter生命週期
    1. init():初始化

      在伺服器啟動後,建立Filter物件,執行init方法。

      只執行一次。一般用於載入資源。

    2. doFilter():請求過濾,響應過濾。
    3. destroy():銷燬

      在伺服器正常關閉時呼叫,一般用於釋放資源

  1. 過濾器攔截路徑
    1. 攔截資源:/index.jsp, /loginServlet

        只有訪問具體資源時,過濾器才會被執行

      2.攔截目錄:/user/*

        只有訪問/user下的資源時,過濾器才會被執行

      3.字尾名攔截:*.jsp (沒有/)

      4. 攔截所有資源:/*

  1. 過濾器的攔截方式:資源的訪問方式
    1. 註解配置:配置dispatcherType屬性

- REQUEST: 預設值,資源被瀏覽器直接訪問時,才被攔截

- FORWARD: 轉發訪問這個資源時,才被攔截

- INCLUDE:包含訪問資源時,才被攔截

- ASYNC:非同步訪問資源時,才被攔截

@WebFilter(dispatcherType={DispatcherType.REQUEST, DispatcherType.FORWARD});

2. xml配置

  1. 攔截鏈
    1. 執行順序:請求過濾按先後順序由小到大執行,響應順序則正好相反

All filter... (@WebFilter(/*))

hello Filter... (@WebFilter(/hello.jsp))

你好,JSP (hello.jsp)

hello Filter back...

All filter…

2. 過濾器的先後順序

* 註解配置:- 按字串比較規則,由小到大執行。

如:/*先於/login.jsp執行

- 如果有重複,則從小到大覆蓋執行

如:/* 和 /login.jsp在請求login.js時都執行過濾

* web.xml配置:誰在上,誰先執行

  1. 登入案例

  - 訪問案例的資源。驗證其是否登入

   - 如果登入了,則直接放行。

  - 如果沒有登入,則跳轉到登入頁面,提示"您尚未登入,請先登入"。

@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig config) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request1=(HttpServletRequest) request;

        String uri=request1.getRequestURI();
        //注意:要過濾資源,否則樣式和字型等login的資源不顯示
        if(uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/fonts/") || uri.contains("/js/") || uri.contains("/checkCodeServlet"))
        {
            chain.doFilter(request, response);
        } else {
            String userName= (String) request1.getSession().getAttribute("username");
            if(null != userName && !"".equals(userName))
            {
                chain.doFilter(request, response);
            }else {
                request.setAttribute("loginMsg","您未登入,請登入!");
                request.getRequestDispatcher("/hellouser/login.jsp").forward(request, response);
            }
        }

    }
}