標籤:java 過濾器
1. 有時我們需要在程式中每一個頁面做相同的操作,比如說登入驗證,請求參數的編碼問題等,這時我們就需要寫一個過濾器做這些重複的動作。過濾器就相當於你想去某個地方時,肯定會從我(過濾器)這經過,並且得檢查你身上有沒有不該有點的東西,並且由我來決定你是否可以過去(可以過去就是過濾器中的代碼,即chain.doFilter(request,response))。總之,像個門前的保安啊。
2. 過濾器應用分兩步:
a) 書寫過濾器
b) 在web.xml中配置過濾器
3. 書寫過濾器手寫必須實現javax.servlet.Filter介面,初始化和銷毀對象的方法可以是空的方法體,而doFilter方法就是過濾要執行的內容。
4. 一個HelloWord執行個體
publicclass HelloFilterimplements Filter{ // 【啟動執行,在建立執行個體後】 執行一次 @Override publicvoid init(FilterConfig filterConfig)throws ServletException {} // 每次訪問時候執行,執行n次 @Override publicvoid doFilter(ServletRequest request, ServletResponseresponse, FilterChain chain) throws IOException, ServletException { System.out.println("3.過濾器業務處理操作(通用操作處理開始)"); // 允許存取 (去到servlet)即可以去執行被請求的資源了 chain.doFilter(request, response); System.out.println("5.執行結束"); } @Override publicvoid destroy() {} } |
5. 過濾器執行的流程
伺服器啟動:
1.調用過濾器構造方法, 建立過濾器執行個體
2.調用init方法, 執行初始化方法
使用者訪問:
3. 執行過濾器過濾方法:doFilter(request,response,chain);
4. 處理過濾器業務
5. 處理完後,允許存取(chain.doFilter)
接下來進入下一個過濾器,如果沒有下一個過濾器,就直接執行請求資源(servlet或jsp)
6. servlet處理業務
7.控制權又回到過濾器(最後是由過濾器響應回瀏覽器的)!
伺服器停止:
執行所有過濾器的destroy方法。
6. 配置過濾器
<!-- 第一個過濾器配置 --> <filter> <filter-name>hellofilter</filter-name> <filter-class>cn.itcast.a_hello.HelloFilter</filter-class> </filter> <!--攔截哪些請求 (現在指定了攔截所有的請求:html/jsp/servlet)--> <filter-mapping> <filter-name>hellofilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
7. 詳細講解過濾器配置過程
對於過濾器的配置,首先應該說明的是過濾器就是一個特殊的servlet,filter的配置比較簡單模仿即可。
Filter-maping的配置主要是如何配置過濾到指定的資源
url-pattern的配置
a) url-pattern中“/”代表當前工程路徑
b) “/*”說明要過濾當前web工程下的所有(目錄)資源(包括css,js,圖片等,可能會造成頁面顯示樣式出錯)。
c) 指定工程目錄,比如說只想過濾一些我想過濾的頁面,可以直接寫訪問頁面的路徑。例:/manage/home/main.jsp
d) 也可以過濾所有的jsp頁面。例:*.jsp
e) 當然當servlet-maping的url-pattern若都有.action或者.do(其他尾碼類似)也可以對servlet全部過濾。例:*.actioin或者*.do(這在過濾編碼時很常用)
說明:url-pattern並不只是單單指瀏覽器中的網域名稱地址(location)
而是指瀏覽器發出的所有請求的url。如(這是Firefox瀏覽器的firebug工具,可以嘗試):
Servlet-name配置
f) 若果要指定需要過濾的servlet,則可以在fiter-maping中配置servlet-name。此處的servlet-name應該跟servlet中的servlet-name的配置要一致
<filter-mapping> <filter-name>UTF8EncodingFilter</filter-name> <!-- 被過濾的目錄或者servlet--> <url-pattern>/manage/*</url-pattern> <servlet-name>LoginServlet</servlet-name> <servlet-name>CourseServlet</servlet-name> <servlet-name>StudentServlet</servlet-name> <servlet-name>SeleCourseServlet</servlet-name> <servlet-name>StuScoreServlet</servlet-name> </filter-mapping> |
圖中的url-pattern就是要過濾web工程目錄下的manage目錄下的所有檔案。
Dispatcher配置
g) 當程式執行到指定的請求方式時,會被過濾。
<dispatcher>REQUEST</dispatcher> (預設,寫了跟沒寫一樣效果)直接存取時候會被攔截 <dispatcher>FORWARD</dispatcher> 只會攔截轉寄的請求 即,執行req.getRequestDispatcher(“index.jsp).forward(req,resp)會被攔截 <dispatcher>INCLUDE</dispatcher> 執行request.getRequestDispatcher("/index.jsp").include(request, response); 的時候,會被攔截 <dispatcher>ERROR</dispatcher> 當遇到聲明式異常的時候執行過濾攔截,然後再跳轉到指定錯誤頁面 附:聲明式異常: <error-page> <error-code>404</error-code> <location>/xxjsp</location> </error-page> 或者 <error-page> <exception-type>NullPo...</exception-type> <location>/xx.jsp</location> </error-page> |
JavaWeb之Java過濾器