《Java Web開發(fā)從入門到實戰(zhàn)(IntelliJ IDEA版·微課視頻版)》 課件 第6章 過濾器與監(jiān)聽器_第1頁
《Java Web開發(fā)從入門到實戰(zhàn)(IntelliJ IDEA版·微課視頻版)》 課件 第6章 過濾器與監(jiān)聽器_第2頁
《Java Web開發(fā)從入門到實戰(zhàn)(IntelliJ IDEA版·微課視頻版)》 課件 第6章 過濾器與監(jiān)聽器_第3頁
《Java Web開發(fā)從入門到實戰(zhàn)(IntelliJ IDEA版·微課視頻版)》 課件 第6章 過濾器與監(jiān)聽器_第4頁
《Java Web開發(fā)從入門到實戰(zhàn)(IntelliJ IDEA版·微課視頻版)》 課件 第6章 過濾器與監(jiān)聽器_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第6章過濾器與監(jiān)聽器學習目的與要求本章主要介紹過濾器與監(jiān)聽器的概念、原理以及實際應用。通過本章的學習,理解過濾器與監(jiān)聽器的原理,掌握過濾器與監(jiān)聽器的實際應用。《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

學習目的與要求《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.1Filter類與Filter對象6.2Filter對象的部署與運行6.3過濾器的實際應用6.4監(jiān)聽器的分類與創(chuàng)建6.5監(jiān)聽器的實際應用——統(tǒng)計在線用戶6.1Filter類與Filter對象過濾器位于服務器處理請求之前或服務器響應請求之前。也就是說,它可以過濾瀏覽器對服務器的請求,也可以過濾服務器對瀏覽器的響應?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

瀏覽器Web服務器Servlet處理請求響應請求HTTP請求HTTP響應過濾后的請求圖6.1過濾器過濾器過濾器過濾前的響應6.1Filter類與Filter對象編寫一個過濾器類很簡單,只要實現(xiàn)jakarta.servlet包中的Filter接口。實現(xiàn)Filter接口的類習慣地稱為一個Filter類,這樣的類創(chuàng)建的對象又習慣地稱為Filter對象。Filter接口與Servlet接口很類似,同樣都有init()與destroy()方法,還有一個doFilter()方法類似于Servlet接口的service()方法。 publicvoidinit(FilterConfig

fConfig)throwsServletException publicvoiddoFilter(ServletRequest

request,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException publicvoiddestroy()《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

init(FilterConfigfConfig) publicvoidinit(FilterConfigfConfig)throwsServletException該方法的功能是初始化過濾器對象。如果為過濾器設置了初始參數(shù),則可以通過FilterConfig的getInitParameter(StringparamName)方法獲得初始參數(shù)值?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

doFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain) publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException當Web服務器使用Servlet對象調(diào)用service()方法處理請求前,發(fā)現(xiàn)應用了某個過濾器時,Web服務器就會自動調(diào)用該過濾器的doFilter()方法。在doFilter()方法中有這樣一條語句:chain.doFilter(request,response);如果執(zhí)行了該語句,就會執(zhí)行下一個過濾器,如果沒有下一個過濾器,就返回請求目標程序。如果因為某個原因沒有執(zhí)行“chain.doFilter(request,response);”,則請求就不會繼續(xù)交給以后的過濾器或請求目標程序,這就是所謂的攔截請求。《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

destroy()

publicvoiddestroy()當Web服務器終止服務時,destroy()方法會被執(zhí)行,使Filter對象消亡。【例6-1】在Web項目ch6中,編寫一個簡單的Filter類FirstFilter,F(xiàn)ilter類的功能要求:無論用戶請求該Web項目的哪個頁面或Servlet,都會在瀏覽器中先出現(xiàn)“首先執(zhí)行過濾器”這樣的響應信息?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

學習目的與要求《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.1Filter類與Filter對象6.2Filter對象的部署與運行6.3過濾器的實際應用6.4監(jiān)聽器的分類與創(chuàng)建6.5監(jiān)聽器的實際應用——統(tǒng)計在線用戶6.2.1在web.xml中部署過濾器<filter> <filter-name>firstFilter</filter-name> <filter-class>filter.FirstFilter</filter-class></filter><filter-mapping> <filter-name>firstFilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping>《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

2.運行Filter只要用戶請求的URL和<filter-mapping>的子標記<url-pattern>指定的模式匹配的話,Web服務器就會自動調(diào)用該Filter的doFilter()方法。如6.1節(jié)中的FirstFilter過濾器在web.xml中的<url-pattern>指定值為/*,“/*”代表任何頁面或Servlet的請求。為了測試過濾器,在web項目ch6中新建一個JSP頁面test.jsp,運行test.jsp顯示如圖6.2的結果?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.2.2基于注解的方式部署過濾器從Servlet3.0開始提供了注解@WebFilter,使得不再需要在web.xml文件中進行Filter的部署描述。但在實際的Web項目中,不需要大量開發(fā)Filter,因此,采用哪種方式部署過濾器都不太麻煩。@WebFilter用于將一個類聲明為過濾器,該注解將會在部署時被容器處理,容器將根據(jù)具體的屬性配置,將相應的類部署為過濾器?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

屬性名類

型描

述filterNameString指定過濾器的name屬性,等價于<filter-name>。valueString[]該屬性等價于urlPatterns屬性,但兩個屬性不能同時使用。urlPatternsString[]指定一組過濾器的URL匹配模式。等價于<url-pattern>標簽。servletNamesString[]指定過濾器將應用于哪些Servlet。取值是@WebServlet中的name屬性的取值,或者是web.xml中<servlet-name>的取值。initParamsWebInitParam[]指定一組過濾器初始化參數(shù),等價于<init-param>標簽。6.2.2基于注解的方式部署過濾器【例6-2】基于注解的Filter——SecondFilter。@WebFilter(filterName

="secondFilter",urlPatterns={"/*"})publicclassSecondFilterimplementsFilter{}《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.2.3過濾器的執(zhí)行順序為了驗證過濾器的執(zhí)行順序,新建SecondFilter、ThreeFilter、FourFilter和ZFilter。其中SecondFilter、ThreeFilter和FourFilter使用注解的方式部署,它們的urlPatterns都是"/*";而ZFilter在web.xml中部署,并部署在FirstFilter的前面。從圖6.3可以看出,過濾器攔截路徑相同時,首先按照<filter-mapping>標記在web.xml中出現(xiàn)的先后順序執(zhí)行過濾器,然后再按照過濾器類名的字典順序執(zhí)行注解的過濾器?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.2.4實踐環(huán)節(jié)——過濾器的初始化參數(shù)給6.2.3節(jié)中的SecondFilter添加初始化參數(shù),并在該過濾器的init()方法中獲取這些參數(shù)。@WebInitParam注解給過濾器添加參數(shù)的示例代碼如下:@WebFilter(filterName="xxxFilter",urlPatterns={"/*"},initParams={ @WebInitParam(name="firstParam",value="one"), @WebInitParam(name="secondParam",value="two")})《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

學習目的與要求《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.1Filter類與Filter對象6.2Filter對象的部署與運行6.3過濾器的實際應用6.4監(jiān)聽器的分類與創(chuàng)建6.5監(jiān)聽器的實際應用——統(tǒng)計在線用戶6.3.1字符編碼過濾器在本書的3.1.3節(jié)中,介紹了中文亂碼的解決方法,其中一種解決方法是:在獲取表單信息之前,使用request對象調(diào)用setCharacterEncoding(String

code)方法設置統(tǒng)一字符編碼。使用該方法解決中文亂碼問題時,接受參數(shù)的每個頁面或Servlet都需要執(zhí)行request.setCharacterEncoding("XXX")語句。為了避免每個頁面或Servlet都編寫request.setCharacterEncoding("XXX")語句,可以使用過濾器進行字符編碼處理?!纠?-3】字符編碼過濾器——SetCharacterEncodingFilter?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.3.2登錄驗證過濾器在Web項目中,某些頁面或Servlet只有用戶登錄成功才能訪問。如果直接在應用程序每個相關的源代碼中進行判斷用戶是否登錄成功,并不是科學的做法。這時可以實現(xiàn)一個登錄驗證過濾器,不用在每個相關的源代碼中驗證用戶是否登錄成功。【例6-4】按照1.2.2節(jié)的操作步驟,創(chuàng)建一個Web項目loginValidate,并為loginValidate添加Tomcat依賴。在該Web項目中至少編寫兩個JSP頁面:login.jsp與loginSuccess.jsp,一個Servlet(由LoginServlet.java負責創(chuàng)建)。用戶在login.jsp頁面中輸入用戶名和密碼后,提交給Servlet,在Servlet中判斷用戶名和密碼是否正確,若正確跳轉(zhuǎn)到loginSuccess.jsp,若錯誤回到login.jsp頁面。但該Web項目有另外一個要求:除了訪問login.jsp頁面和LoginServlet外,別的頁面或Servlet都不能直接訪問,必須先登錄成功才能訪問。在設計這個Web項目時,編寫了一個登錄驗證過濾器并在該Web項目中使用。《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

學習目的與要求《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.1Filter類與Filter對象6.2Filter對象的部署與運行6.3過濾器的實際應用6.4監(jiān)聽器的分類與創(chuàng)建6.5監(jiān)聽器的實際應用——統(tǒng)計在線用戶6.4監(jiān)聽器的分類與創(chuàng)建創(chuàng)建不同功能的監(jiān)聽器類,需要實現(xiàn)不同的監(jiān)聽接口。一個監(jiān)聽類可以實現(xiàn)多個接口,即可以多種功能的監(jiān)聽器一起工作。根據(jù)監(jiān)聽的對象可將監(jiān)聽器劃分為:ServletContext對象監(jiān)聽器、HttpSession對象監(jiān)聽器以及ServletRequest對象監(jiān)聽器。根據(jù)監(jiān)聽的事件可將監(jiān)聽器劃分為:對象自身的創(chuàng)建和銷毀的監(jiān)聽器、對象中屬性的創(chuàng)建、修改和消除的監(jiān)聽器以及session中某個對象狀態(tài)變化的監(jiān)聽器?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.4.1監(jiān)聽對象自身創(chuàng)建和銷毀的監(jiān)聽器HttpSessionListener、ServletContextListener和ServletRequestListener監(jiān)聽接口分別監(jiān)聽session、context和request對象的創(chuàng)建與銷毀。

HttpSessionListener:監(jiān)聽session的創(chuàng)建與銷毀。創(chuàng)建session時執(zhí)行sessionCreated(HttpSessionEvent

se)方法。超時或執(zhí)行session.invalidate()時執(zhí)行sessionDestroyed(HttpSessionEvent

se)方法。該監(jiān)聽器可用于統(tǒng)計在線人數(shù)、記錄訪問日志等。

ServletContextListener:監(jiān)聽context的創(chuàng)建與銷毀。context代表當前Web應用程序。服務器啟動時執(zhí)行contextInitialized(ServletContextEventsce)方法。服務器關閉時執(zhí)行contextDestroyed(ServletContextEvent

sce)方法。該監(jiān)聽器可用于啟動時獲取web.xml中配置的初始化參數(shù),可作為定時器、加載全局屬性對象、創(chuàng)建全局數(shù)據(jù)庫連接、加載緩存信息等。

ServletRequestListener:監(jiān)聽request的創(chuàng)建與銷毀。用戶每次請求request都將執(zhí)行requestInitialized(ServletRequestEvent

sre)方法。request處理完畢自動銷毀前執(zhí)行requestDestroyed(ServletRequestEvent

sre)方法。該監(jiān)聽器可用于讀取request參數(shù),記錄訪問歷史。《JavaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.4.1監(jiān)聽對象自身創(chuàng)建和銷毀的監(jiān)聽器【例6-5】在ch6的src目錄下創(chuàng)建一個名為listener的包,并在包中創(chuàng)建一個名為MyObjectListener的監(jiān)聽器類,該監(jiān)聽器類實現(xiàn)HttpSessionListener、ServletContextListener和ServletRequestListener監(jiān)聽接口。在web.xml文件中部署監(jiān)聽器,示例代碼如下:<listener>

<listener-class>完整類名</listener-class></listener>監(jiān)聽器的啟動順序是按照web.xml的配置順序來啟動;加載順序是按照“監(jiān)聽器->過濾器->Servlet”順序加載?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.4.2監(jiān)聽對象屬性變化的監(jiān)聽器監(jiān)聽對象屬性變化的監(jiān)聽器,分別為HttpSessionAttributeListener、ServletContextAttributeListener、ServletRequestAttributeListener。此3個監(jiān)聽接口分別用于監(jiān)聽session、context和request的屬性變化。當向被監(jiān)聽對象中添加、更新、移除屬性時,將分別執(zhí)行attributeAdded、attributeReplaced、attributeRemoved方法?!纠?-6】在ch6的listener包中創(chuàng)建一個名為MyAttributeListener的監(jiān)聽器類,該監(jiān)聽器類實現(xiàn)HttpSessionAttributeListener監(jiān)聽接口?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.4.3監(jiān)聽session中某個對象狀態(tài)變化的監(jiān)聽器監(jiān)聽綁定到HttpSeesion域中某個對象狀態(tài)的事件監(jiān)聽器有HttpSessionBindingListener和HttpSessionActivationListener。HttpSession中對象的狀態(tài)有:綁定→解除綁定,鈍化→活化。綁定,通過setAttribute保存到session對象當中。解除綁定,通過removeAttribue去除綁定。鈍化,將session對象持久化到存儲設備上?;罨?,將session對象從存儲設備上進行恢復。被實現(xiàn)鈍化和活化的監(jiān)聽器對象必須實現(xiàn)Serializable接口,不需要在web.xml中部署。

HttpSessionBindingListener:當對象被放到session里時,執(zhí)行valueBound(HttpSessionBindingEvent

event)方法。當對象被從session里移除時,執(zhí)行valueUnbound(HttpSessionBindingEvent

event)方法。對象必須實現(xiàn)該監(jiān)聽接口。

HttpSessionActivationListener:當session里的對象被鈍化時,執(zhí)行sessionWillPassivate(HttpSessionEvent

se)方法。當對象被重新加載(活化)時,執(zhí)行sessionDidActivate(HttpSessionEventse)方法。對象必須實現(xiàn)該監(jiān)聽接口?!禞avaWeb開發(fā)從入門到實戰(zhàn)(微課視頻版)(IntelliJIDEA版)》陳恒

主編,清華大學出版社,2024

6.4.3監(jiān)聽session中某個對象狀態(tài)變化的監(jiān)聽器【例6-7】在ch6的listener包中創(chuàng)建一個名為MySeesionListener的監(jiān)聽器類,該監(jiān)聽器類實現(xiàn)HttpSessionBindingListener、HttpSessionAc

溫馨提示

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

評論

0/150

提交評論