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);
            }
        }

    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM