學習筆記——javaWeb過濾器
過濾器是一個服務器端組件,它可以截取用戶端的請求與相應信息,并對這些信息過濾。
簡單說,就是可以實現web容器對某資源的訪問前截獲進行相關的處理,還可以在某資源向web容器返回響應前進行截獲進行處理。
根據過濾器在Web.xml中的設置,特定的網址會經過特定的過濾器。隨后通過過濾器的處理,再將處理過的用戶請求發送至web資源,資源響應之后再發送到過濾器,過濾器再處理之后,才發送給用戶。
具體處理過程:多個過濾器的情況下,會先執行第一個過濾器chain.doFilter()前的代碼,然后doFilter()到達第二個過濾器。第二個過濾器也會先執行chain.doFilter()前的代碼,然后doFilter()到達Servlet.service()方法。之后在返回過濾器2doFilter()之后的代碼,在返回過濾器1doFilter()之后的代碼,最后才返回用戶。3.如何編寫一個簡單過濾器
3.1過濾器的三個主要方法
編寫過濾器之前,先熟悉一下過濾器的三個主要方法:3.2 繼承 javax.servlet.Filter
開始編寫第一步:繼承public class MyFirstFilter implements javax.servlet.Filter3.3 重寫doFilter
第二步:重寫
public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException { //你的代碼 chain.doFilter(req, resp); }3.4 注冊Filter
第三步:注冊
4.過濾器的分類
過濾器根據其處理的請求類別,分為5類。Servlet2.5中定義了request,Forward,Include,Error四類,而Servlet3.0中定義了第5類:Async。下圖中的RequestDispatcher的forward方法等于<jsp:forward>方法,同理,include等于<jsp:include>方法。第5類,Async用于通過過濾器訪問的Servlet有大量耗時操作時,可直接回到過濾器chain.doFilter()之后的代碼運行,讓Servlet異步運行計算操作。5.過濾器的應用
1.登錄驗證1.1將過濾器的url地址設為“/*”
<filter-mapping> <filter-name>MyFirstFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>1.2查看session中是否有登錄名public void doFilter(javax.servlet.ServletRequest req, javax.servlet.ServletResponse resp, javax.servlet.FilterChain chain) throws javax.servlet.ServletException, IOException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; HttpSession session = request.getSession(); String username = (String) session.getAttribute("username"); if ("".equals(username) || username == null) { response.sendRedirect("login.jsp"); } chain.doFilter(req, resp); }2.編碼 轉換在過濾其中添加以下語句:request.setCharacterEncoding("UTF-8");6.過濾器的其他問題
1.過濾器能否改變用戶請求的資源,即改變用戶請求的路徑?答:可以的。過濾器可通過,request.sendRedirect()方法或response.getDispatcher().forWord()方法改變用戶請求的路徑。2.過濾器能否直接誒返回數據?答:不能。
新聞熱點
疑難解答