jspfilter使用_第1頁
jspfilter使用_第2頁
jspfilter使用_第3頁
jspfilter使用_第4頁
jspfilter使用_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Jsp Filter 詳解filter功能.它使用戶可以改變一個request和修改一個response. Filter不是一個servlet,它不能產生一個 response它能夠在一個 request到達servlet之前預處理 request,也可以在離開 servlet 時處理 response換種說法 filter 其實是一個” servlet chaining ” (servlet 鏈).一個 filter 包括 :1. 在 servlet 被調用之前截獲 ;2. 在 servlet 被調用之前檢查 servlet request;3. 根據需要修改request頭和request

2、數據;4. 根據需要修改 response頭和response數據;5. 在 servlet 被調用之后截獲 .respo nse是條路,目的地是servlet,這個通俗點說法 filter 相當于加油站, request 是條路,加油站設在什么地方對什么數據操作可以由你來控制。一些需要過濾器的情況:(1) 認證 Filter(2) 日志和審核 Filter(3) 圖片轉換 Filter(4) 數據壓縮 Filter(5) 密碼 Filter(6) 令牌 Filter(7) 觸發資源訪問事件的Filter(8) XSLT Filter(9) 媒體類型鏈 Filter1.批量設置請求編碼為 了

3、避免 提交 數據 的 中 文 亂 碼問 題, 需 要 在 每次 使用 請求 之前 設 置 request.setCharacterEncoding(utf-8)編碼格式,麻煩。Filter 可以批量攔截修改 servlet 的請求 和響應。我們編寫一個 EncodingFilter.java ,來批量設置請求編碼。public class EncodingFilter implements Filter public void init(FilterConfig config) throws ServletException public void destroy() public void

4、doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException request.setCharacterEncoding(gb2312); chain.doFilter(request, response);在此 EncodingFilter 實現了 Filter 接口, Filter 接口中定義的三個方法都要在 EncodingFilter 中實現,其中 doFilter() 的代碼實現主要的功能:為請求設置 utf-8 編碼并

5、執行 chain.doFilter() 繼續下面的操作。轉換成對應 HttpServletRequest 和 HttpServletResponse 才能進行下面的 session 操作和頁面 重定向。與 servlet 相似,為了讓 filter 發揮作用還需要在 web.xml 進行配置。 EncodingFilter EncodingFilterEncodingFilter /*filter 標簽部分定義使用的過濾器, filter-mapping 標簽告訴服務器把哪些請求交給過濾器處 理。這里的 /* 表示所有請求, /表示根路徑, *(星號)代表所有請求,加在一起就變成了根 路徑下的

6、所有請求。這樣,所有的請求都會先被 EncodingFilter 攔截,并在請求里設置上指定的 utf-8 編碼。2.用 filter 控制用戶訪問權限出于信息安全和其他一些原因的考慮, 項目中的一些頁面要求用戶滿足了一定條件之后才 能訪問讓用戶輸入帳號和密碼,如果輸入的信息正確就在 session 里做一個成功的標記,這 里的成功標志就是 session中的username有值;其后在請求保密信息的時候判斷 session中是否有已經登錄成功的標記,存在則可以訪問,不存在則禁止訪問。假設我們要保護的頁面是 admin/index.jsp編寫 SecurityFilter.java ,控制用戶

7、訪問權限public class SecurityFilter implements Filter public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain)throws IOException, ServletException HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;HttpSession ses

8、sion = req.getSession();if (session.getAttribute(username) != null) chain.doFilter(request, response); else res.sendRedirect(./failure.jsp);web.xml 進行如下配置SecurityFilter SecurityFilterSecurityFilter /admin/*定義 SecurityFilter 過濾器,讓它過濾匹配 /admin/* 的所有請求, /admin/ 路徑下的所有請求 都會接受 SecurityFilter 的檢查, 注意: 如要對

9、各個目錄設置不同的角色可以訪問, 需要在過 濾器中添加判斷角色是否可以訪問該 url 地址的方法,詳細的說明請參考基于角色的權限控 制。因為 Filter 本來設計成為多種協議服務, http 協議僅僅是其中一種 ,將 ServletRequest 和 ServletResponse轉換成 HttpServletRequest 和 HttpServletResponse 才能進行下面的 session 操 作和頁面重定向。得到了 http請求之后,可以獲得請求對應的 session,判斷session中的username變量是否為 null ,如果不為 null ,說明用戶已經登錄,就可以調用

10、 doFilter 繼續請求訪問的資源。如果為 null ,說明用戶還沒有登錄,禁止用戶訪問,并使用頁面重定向跳轉到failure.jsp 頁面顯示提示信息。因 為 /failure.jsp 的 位 置 在 /admin/ 目 錄 的 上 一 級 , 所 以 加 上 兩 個 點 才 能 正 確 跳 轉 到 failure.jsp ,兩個點( .)代表當前路徑的上一級路徑。3.日志和審核 Filterpublic class LoggingFilter implements Filter private FilterConfig filterConfig = null;public void i

11、nit(FilterConfig config) throws ServletException this.filterConfig = config;下面是向服務器控制臺輸出log,這里做的是演示,更多的是使用Iog4jpublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException String address = request.getRemoteAddr(); filterConfig.getServ

12、letContext().log(User IP: + address); chain.doFilter(request, response);public void destroy() web.xml 配置LoggingFilter samjava.filter.LoggingFilterLoggingFilter/*4.filter 所謂的特性請求映射 filter-mapping 和 servlet-mapping 都是將對應的 filter 或 servlet 映射到某個 url-pattern 上,當客戶發起某一請求時, 服務器先將此請求與 web.xml 中定義的所有 url-pa

13、ttern 進行匹配,然后執行匹配通過的filter 和 servlet。你可以使用三種方式定義 url-pattern 。直接映射一個請求。TestServlet/TestServlet映射一個路徑下的所有請求。EncodingFilter/*需要注意的是,這種寫法必須以 /開頭,寫成與絕對路徑的形式,即便是映射所有請求也要 寫成 /* ,不能簡化成 * 。映射結尾相同的一類請求。ControllerServlet*.do需要注意的是, 這種請求映射就不能指定某一路徑了,它必須是以星號( *)開始字母結尾,不能寫成 /*.do 的形式。5.過濾鏈我們使用了兩個過濾器, EncodingFil

14、ter 負責設置編碼, SecurityFilter 負責控制權限, 那這 兩個過濾器是怎么起作用的呢?所有的奧秘就在 Filter 中的 FilterChain 中。服務器會按照 web.xml 中過濾器定義的先后循 序組裝成一條鏈,然后一次執行其中的doFilter() 方法。執行的順序就如上圖所示,執行第 一個過濾器的 chain.doFilter() 之前的代碼, 第二個過濾器的 chain.doFilter() 之前的代碼, 請求 的資源, 第二個過濾器的 chain.doFilter() 之后的代碼, 第一個過濾器的 chain.doFilter() 之后的 代碼,最后返回響應。代

15、碼執行順序是:(1) 執 行 EncodingFilter.doFilter() 中 chain.doFilter() 之 前 的 部 分 : request.setCharacterEncoding(gb2312);(2) 執行 SecurityFilter.doFilter() 中 chain.doFilter() 之前的部分:判斷用戶是否已登錄(3) 如果用戶已登錄,則訪問請求的資源:/admin/index.jsp(4) 如果用戶未登錄,則頁面重定向到: /failure.jsp(5) 執行 SecurityFilter.doFilter() 中 chain.doFilter() 之后

16、的部分 ;(6) 執行 EncodingFilter.doFilter() 中 chain.doFilter() 之后的部分 ;說的簡單點就是 filter 將按照在 web.xml 文件中的聲明順序調用。過濾鏈的好處是,執行過程中任何時候都可以打斷,只要不執行 chain.doFilter() 就不會再 執行后面的過濾器和請求的內容。要特別注意過濾鏈的執行順序問題,像 EncodingFilter 就一定要放在所有 Filter 之前 ( 在 web.xml 文件中 ),這樣才能確保在使用請求中的數據前設置正確的編碼。6.filter 的詳細配置我們已經了解了 filter 的基本用法,還有一些細節配置在特殊情況下起作用。在 servlet-2.3 中, Filter 會過濾一切請求,包括服務器內部使用 forward 轉發請求和 的情況。到了 servlet-2.4 中 Filter 默認下只攔截外部提交的請求, forward 和 include 這些內部轉發 都不會被過濾,但是有時候我們需要 forward 的時候也用到 Filter ,這樣就需要如下配置。TestFilter sam.TestFilter TestFilter /*

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論