學(xué)習(xí)筆記——javaWeb過濾器
過濾器是一個(gè)服務(wù)器端組件,它可以截取用戶端的請求與相應(yīng)信息,并對這些信息過濾。
簡單說,就是可以實(shí)現(xiàn)web容器對某資源的訪問前截獲進(jìn)行相關(guān)的處理,還可以在某資源向web容器返回響應(yīng)前進(jìn)行截獲進(jìn)行處理。
根據(jù)過濾器在Web.xml中的設(shè)置,特定的網(wǎng)址會(huì)經(jīng)過特定的過濾器。隨后通過過濾器的處理,再將處理過的用戶請求發(fā)送至web資源,資源響應(yīng)之后再發(fā)送到過濾器,過濾器再處理之后,才發(fā)送給用戶。
具體處理過程:多個(gè)過濾器的情況下,會(huì)先執(zhí)行第一個(gè)過濾器chain.doFilter()前的代碼,然后doFilter()到達(dá)第二個(gè)過濾器。第二個(gè)過濾器也會(huì)先執(zhí)行chain.doFilter()前的代碼,然后doFilter()到達(dá)Servlet.service()方法。之后在返回過濾器2doFilter()之后的代碼,在返回過濾器1doFilter()之后的代碼,最后才返回用戶。3.如何編寫一個(gè)簡單過濾器
3.1過濾器的三個(gè)主要方法
編寫過濾器之前,先熟悉一下過濾器的三個(gè)主要方法: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.過濾器的分類
過濾器根據(jù)其處理的請求類別,分為5類。Servlet2.5中定義了request,F(xiàn)orward,Include,Error四類,而Servlet3.0中定義了第5類:Async。下圖中的RequestDispatcher的forward方法等于<jsp:forward>方法,同理,include等于<jsp:include>方法。第5類,Async用于通過過濾器訪問的Servlet有大量耗時(shí)操作時(shí),可直接回到過濾器chain.doFilter()之后的代碼運(yùn)行,讓Servlet異步運(yùn)行計(jì)算操作。5.過濾器的應(yīng)用
1.登錄驗(yàn)證1.1將過濾器的url地址設(shè)為“/*”
<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.編碼 轉(zhuǎn)換在過濾其中添加以下語句:request.setCharacterEncoding("UTF-8");6.過濾器的其他問題
1.過濾器能否改變用戶請求的資源,即改變用戶請求的路徑?答:可以的。過濾器可通過,request.sendRedirect()方法或response.getDispatcher().forWord()方法改變用戶請求的路徑。2.過濾器能否直接誒返回?cái)?shù)據(jù)?答:不能。
新聞熱點(diǎn)
疑難解答
圖片精選