




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
提出問題應用中常有這樣的功能:1.有好些頁面只有是登陸的客戶才能查看顯示2.Servlet在獲取請求參數時,為了防止中文亂碼,都需要設置請求編碼字符集如果用現有的知識去做的話,需要在每個jsp或Servlet中做同樣的操作,如何簡化這種重復性的操作呢?過濾器:Filter現實案例一輛地鐵車有好些門,
你可以從任意一個進入坐地鐵,
但需要你花2元錢才可以坐上,那現在
怎么解決這個問題呢?方法1:在地鐵的每個門都設置一個關卡刷卡方法2:
在站臺外設置一個
的關卡來刷卡,如果有錢才可以進行坐車,
要沒有錢不能讓你進站方法2使用的就是過濾器技術,這樣能極大的提高代碼的復用Filter(過濾器)簡介Filter的基本功能是對
Servlet容器調用
Servlet(JSP)的過程進行
,從而在
Servlet處理請求前和Servlet響應請求后實現一些特殊的功能。在
Servlet
API
中定義了三個接口類來開供開發 編寫Filter
程序:Filter,FilterChain,FilterConfigFilter
程序是一個實現了Filter
接口的Java
類,與Servlet
程序相似,它由Servlet容器進行調用和執行Filter
程序需要在
web.xml
文件中進行 和設置它所能的資源:Filter
程序可以
Jsp,
Servlet,
靜態
文件和靜態html文件Filter
的過濾過程Filter
的過濾過程Filter
的基本工作原理當在
web.xml
中
了一個
Filter
來對某個
Servlet
程序進行
處理時,這個
Filter
就成了
Tomcat與該
Servlet
程序的通信線
的一道關卡,該
Filter
可以對
Servlet
容器發送給
Servlet程序的請求和
Servlet程序回送給
Servlet容器的響應進行
,可以決定是否將請求繼續傳遞給
Servlet程序,以及對請求和相應信息是否進行修改在一個
web
應用程序中可以
多個
Filter
程序,每個
Filter
程序都可以對一個或一組
Servlet
程序進行
。若有多個
Filter
程序對某個
Servlet
程序的
過程進行
,當針對該
Servlet
的
請求到達時,web
容器將把這多個
Filter
程序組一個
Filter
鏈(過濾器鏈)。Filter
鏈中各個
Filter
的
順序與它們在應用程序的
web.xml
中
的順序一致Filter
接口init(FilterConfig
filterConfig)throws
ServletException:在
web
應用程序啟動時,web
服務器將根據
web.xml
文件中的配置信息來創建每個
的
Filter
實例對象,并將其保存在服務器的內存中。Web容器創建
Filter
對象實例后,將立即調用該
Filter
對象的
init
方法。Init方法在
Filter
生命周期中僅執行一次,web
容器在調用
init
方法時,會傳遞一個包含
Filter
的配置和運行環境的
FilterConfig
對象
(FilterConfig的用法和ServletConfig類似)。利用FilterConfig對象可以得到ServletContext對象,以及部署描述符中配置的過濾器的初始化參數。在這個方法中,可以拋出ServletException異常,通知容器該過濾器不能正常工作。destroy():在Web容器卸載
Filter對象之前被調用。該方法在Filter的生命周期中僅執行一次。在這個方法中,可以
過濾器使用的資源與開發Servlet不同的是,Filter接口并沒有相應的實現類可供繼承,要開發過濾器,只能直接實現Filter接口。Filter
接口doFilter(ServletRequest
request,ServletResponse
response,FilterChain
chain)throws
java.io.IOException,ServletException:doFilter()方法類似于Servlet接口的service()方法。當客戶端請求目標資源的時候,容器就會調用與這個目標資源相關聯的過濾器的
doFilter()方法。其中參數
request,
response
為
web
容器或
Filter鏈的上一個
Filter
傳遞過來的請求和相應對象;參數chain
為代表當前
Filter鏈的對象,在特定的操作完成后,可以在當前
Filter
對象的
doFilter
方法
需要調用
FilterChain
對象的
chain.doFilter(request,response)方法才能把請求交付給
Filter鏈中的下一個
Filter
或者目標
Servlet程序去處理,也可以直接向客戶端返回響應信息,或者利用RequestDispatcher的forward()和
include()方法,以及HttpServletResponse的sendRedirect()方法將請求轉向到其他資源。這個方法的請求和響應參數的類型是ServletRequest和ServletResponse,也就是
濾器的使用并不依賴于具體的協議。FilterChain接口FilterChain接口:代表當前Filter鏈的對象。由容器實現,容器將其實例作為參數傳入過濾器對象的doFilter()方法中。過濾器對象使用FilterChain對象調用過濾器鏈中的下一個過濾器,如果該過濾器是鏈中最后一個過濾器,那么將調用目標資源。doFilter(ServletRequest
request,ServletResponseresponse)throwsjava.io.IOException:調用該方法將使過濾器鏈中的下一個過濾器被調用。如果是最后一個過濾器,會調用目標資源。Filter
的過濾過程瀏覽器/day07/test.jspTomcatTest.jspTest1Filter1doFilter(filterChain){//do
domething(1)filterChain.doFilter()//do
something}在請求到資源前做些事在資源處理完請求返回后做些事Test2Filter2doFilter(filterChain){//do
domething(2)filterChain.doFilter()//do
something}Filter
的過濾過程瀏覽器/day07/test.jspTest.jspBefore()
2After()
2UserNamePasswordFilterConfig
接口javax.servlet.FilterConfig接口:該接口類似于ServletConfig接口,由容器實現。Servlet規范將代表ServletContext對象和
Filter
的配置參數信息都封裝在該對象中。Servlet容器將其作為參數傳入過濾器對象的init()方法中。String
getFilterName():得到描述符中指定的過濾器的名字。String
getInitParameter(String
name):返回在部署描述中指定的名字為name的初始化參數的值。如果不存在返回null.
EnumerationgetInitParameterNames():返回過濾器的所有初始化參數的名字的枚舉集合。publicServletContextgetServletContext():返回Servlet上下文對象的
。過濾器的部署在實現一個過濾器后,需要在
web.xml中進行和設置它所能 的資源。這可以通過<filter>和<filter-map
>元素來完成的。<filter>
元素(Filter)一個過濾器。<filter>元素用于在Web應用程序中在<filter>元素內<filter-name>用于為過濾器指定一個名字,該元素的內容不能為空。<filter-class>元素用于指定過濾器的完整的限定類名。<init-param>元素用于為過濾器指定初始化參數,它的子元素<param-name>指定參數的名字,<param-value>指定參數的值。在過濾器中,可以使用FilterConfig接口對象來 初始化參數。<filter>
元素(
Filter)<filter><filter-name>testFitler</filter-name><filter-class>
.test.TestFiter</filter-class><init-param><param-name>word_file</param-name><param-value>/WEB-INF/word.txt</param-value></init-param></filter>Servlet容器對部署描述符中的每一個過濾器,只創建一個實例。與Servlet類似,容器將在同一個過濾器實例上運行多個線程來同時為多個請求服務,因此,開發過濾器時,也要注意線程安全的問題。Filter>元素用于設置一個
Filter所負責 的資的資源可通過兩種方式來指定:Servlet<filter-map源。一個Filter名稱和資源的請求路徑(url樣式)–
<filter-name>子元素用于設置filter的
名稱。該值必須是在<filter>元素中
過的過濾器的名字<url-pattern>設置
filter所<servlet-name>指定過濾器所<dispatcher>指定過濾器所的請求路徑(過濾器關聯的URL樣式)的Servlet名稱。的資源被
Servlet
容器調用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默認REQUEST.可以設置多個<dispatcher>子元素用來指定
Filter
對資源的多種調用方式進行Filter<dispatcher>子元素可以設置的值及其意義:REQUEST:當用戶直接 頁面時,Web容器將會調用過濾器。如果目標資源是通過RequestDispatcher的include()或forward()方法 時,那么該過濾器就不會被調用。INCLUDE:如果目標資源是通過RequestDispatcher的include()方法
時,那么該過濾器將被調用。除此之外,該過濾器不會被調用。FORWARD:如果目標資源是通過RequestDispatcher的forward()方法 時,那么該過濾器將被調用,除此之外,該過濾器不會被調用。ERROR:如果目標資源是通過 式異常處理機制調用時,那么該過濾器將被調用。除此之外,過濾器不會被調用。Filter<filter-map
><filter-name>testFilter</filter-name><url-pattern>/index.jsp</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher></filter-map
><filter-map
><filter-name>testFilter</filter-name><url-pattern>/test.jsp</url-pattern></filter-map
>Filter在同一個web.xml
文件中可以為同一個Filter
設置多個。若一個
Filter
鏈中多次出現了同一個
Filter
程序,這個
Filter
程序的 處理過程將被多次執行o.jspl.jspLogin.jsplogin.jspUserNameFilterPasswordFiltero.jsplogin.jsp
請求提交到
o.jsp。該頁面中有兩個
text,分別為username
和
passwordUserNameFilter、PasswordFilter login.jsp
的請求頁面,即
o.jspUserNameFilter:若username不等于Tom,則將請求轉發到
login.jsp,并提示用戶:“用戶名錯誤”,若等于Tom,則把請求轉給下一個FilterPasswordFilter:若passord不等于1234,則將請求轉發到login.jsp,并提示用戶:“錯誤”,若等于1234,則把請求轉給目標頁面練
:使用Filter實現用戶名和
的過濾IEweb_14/app1/o.jspTomcato.jspNameFilterPasswordFilterpath
:
web_14/app1/
o.jsp練習2:禁用緩存使瀏覽器不緩存頁面的過濾器:瀏覽器緩存當前頁面,它們有3
個HTTP
響應頭字段都可以在Servlet
中的示例代碼如下:resp.setDateHeader("Expires",-1);resp.setHeader("Cache-Control","no-cache");resp.setHeader("Pragma","no-cache");并不是所有的瀏覽器都能完全支持上面的三個響應頭,因此最好是同時使用上面的三個響應頭練習3:解決中文亂碼字符編碼的過濾器–通過配置參數encoding指明使用何種字符編碼,以處理Form請求參數的中文問題練習4:檢測用戶是否登陸情景:系統中的某些頁面只有在正常登陸后才可以使用,用戶請求這些頁面時要檢查
session
中有無該用戶信息,但在所有必要的頁面加上session的判斷相當麻煩的事情解決方案:編寫一個用于檢測用戶是否登陸的過濾器,如果用戶未登錄,則重定向到指的登錄頁面要求:需檢查的在
Session
中保存的關鍵字;如果用戶未登錄,需重定向到指定的頁面(URL不包括
ContextPath);不做檢查的URL列表(以分號分開,并且
URL
中不包括
ContextPath)都要采取可配置的方式練習6:為過濾不雅文字和HTML特殊字符開 壇模塊時要解決以下兩個問題:1.
用戶回復或發帖時可能會輸入
HTML
代碼(例如:<,
>等),這可能會破壞
的正常顯示,也可能會帶來安全隱患。2.某些用戶在回復時可能會輸入不雅子句,這些子句會給論壇帶來不好的影響3.實現對不雅文字的可配置要求:不雅文字及其替換內容實現可配置。***裝飾
HttpServletRequest
對象需求:在HttpServletRequest
對象到達Servlet
之前把用戶輸入的多余空格都去掉情景:因為HttpServletRequest
對象里的請求參數都實際包含在java.util.Map
對象里,而Map是不允許修改的,所以包含在HttpServletRequest
對象里的請求參數不能被修改解決方案:采取Decorator(裝飾器)模式Decorator
模式因為繼承的關系,當需要改變某個對象的行為時,只須擴
展這個對象所屬的類并重寫其有關的方法就可以達到目的。但是,當想要改變其行為的對象是由應用程序里的另一個
子系統(例如:一個對象工廠或是一個Servlet
容器)負責構造,繼承機制將 為力Decorator
模式----情景已知:Messager
類的定義(可以從它派生處一個之類);Messager
對象總是來自一個對象工廠(MessagerFactory),該工廠可以對它創建的每一個Messager
對象進行初始化----通過調用getMessage()方法而獲得的message
屬性也不例外(即不能對Messager
對象進行初始化)假設:需要使用Messager
類的getMessage()方法。有一個Util的使用工具類,該類中有如下方法:public
static
void
broadcast(Message
messager){System.out.println(messager.getMessage());}Decorator
模式----需求,方案需求:讓broadcast
方法打印的字母都是大寫字母方案:從Messager
類派生一個子類,把子類對象傳遞給broadcast
方法。因為只有對象工廠知道如何初始化Messager
對象,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 學校新員工管理制度
- 學校研討課管理制度
- 學校足球社管理制度
- 學生周末班管理制度
- 安全及風險管理制度
- 完善職代會管理制度
- 寶寶店人員管理制度
- 實驗室檢測管理制度
- 宣傳部風控管理制度
- 家具廠車間管理制度
- 15D501建筑物防雷設施安裝圖集
- 房屋安全簡易鑒定表
- 《水產養殖前沿講座》課程教學大綱
- 漁業成品油價格補助專項資金管理暫行辦法
- 卵巢交界性腫瘤課件
- 2023年06月新疆生產建設兵團第十二師“三支一扶”招募高校畢業生筆試題庫含答案解析
- 基于C#的WinForm程序設計學習通課后章節答案期末考試題庫2023年
- GLP-1受體激動劑的血管保護作用
- 十堰市張灣區紅衛街道社區工作者考試真題2022
- 突發性耳聾培訓課件
- 部編版語文八年級上下冊古詩詞默寫卷合集
評論
0/150
提交評論