![《Java Web技術及案例開發(fā)》 課件 第3章-Servlet會話跟蹤_第1頁](http://file4.renrendoc.com/view14/M04/0D/2F/wKhkGWZtvkqAMiY6AAEDsNz1Zx0061.jpg)
![《Java Web技術及案例開發(fā)》 課件 第3章-Servlet會話跟蹤_第2頁](http://file4.renrendoc.com/view14/M04/0D/2F/wKhkGWZtvkqAMiY6AAEDsNz1Zx00612.jpg)
![《Java Web技術及案例開發(fā)》 課件 第3章-Servlet會話跟蹤_第3頁](http://file4.renrendoc.com/view14/M04/0D/2F/wKhkGWZtvkqAMiY6AAEDsNz1Zx00613.jpg)
![《Java Web技術及案例開發(fā)》 課件 第3章-Servlet會話跟蹤_第4頁](http://file4.renrendoc.com/view14/M04/0D/2F/wKhkGWZtvkqAMiY6AAEDsNz1Zx00614.jpg)
![《Java Web技術及案例開發(fā)》 課件 第3章-Servlet會話跟蹤_第5頁](http://file4.renrendoc.com/view14/M04/0D/2F/wKhkGWZtvkqAMiY6AAEDsNz1Zx00615.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第3章Servlet會話跟蹤本章思維導圖本章目標掌握會話跟蹤的相關技術理解Cookie的原理掌握Cookie的讀寫方法使用理解Session的原理理解Session的生命周期熟練掌握Session的方法使用掌握ServletConfig的方法使用掌握ServletContext的方法使用會話跟蹤技術是一種在客戶端與服務器間保持HTTP狀態(tài)的解決方案。從開發(fā)角度考慮,是使上一次請求所傳遞的數(shù)據(jù)能夠維持狀態(tài)到下一次請求,并且辨認出是否相同的客戶端所發(fā)送出來的。會話跟蹤技術的解決方案主要分為以下幾種:Cookie技術Session技術URL重寫技術隱藏表單域技術會話跟蹤技術Cookie技術是一種在客戶端保持會話跟蹤的解決方案。Cookie是指某些網(wǎng)站為了辨別用戶身份而儲存在用戶終端上的文本信息(通常經(jīng)過加密)。Cookie在用戶第一次訪問服務器時,由服務器通過響應頭的方式發(fā)送給客戶端瀏覽器;當用戶再次向服務器發(fā)送請求時會附帶上這些文本信息。通過Cookie,服務器在接收到來自客戶端瀏覽器的請求時,能夠通過分析請求頭的內(nèi)容而得到客戶端特有的信息,從而動態(tài)生成與該客戶端相對應的內(nèi)容。Cookie技術在使用Cookie時,要保證瀏覽器接受Cookie。對IE瀏覽器設置方法是:選擇瀏覽器的工具菜單->“隱私”->“高級”->“接受”選項。注意Cookie對象通過javax.servlet.http.Cookie類的構造方法來創(chuàng)建?!臼纠科渲校珻ookie類的構造方法需要兩個參數(shù):第一個String類型的參數(shù)用于指定Cookie的屬性名;第二個String類型的參數(shù)用于指定屬性值。Cookie對象的創(chuàng)建CookieunameCookie=newCookie("username","zhaokeling");HttpServletResponse對象通過addCookie()方法,以增加“Set-Cookie”響應頭的方式(不是替換原有的)將Cookie對象響應給客戶端瀏覽器,存儲在客戶端機器上。【示例】其中:參數(shù)為一個Cookie對象Cookie對象的響應response.addCookie(unameCookie);生成的Cookie僅在當前瀏覽器有效,不能跨瀏覽器。注意存儲在客戶端的Cookie,通過HttpServletRequest對象的getCookies()方法獲取,該方法返回所訪問網(wǎng)站的所有Cookie的對象數(shù)組,遍歷該數(shù)組可以獲得各個Cookie對象?!臼纠揩@取并遍歷客戶端CookieCookie[]cookies=request.getCookie();if(cookies!=null)for(Cookiec:cookies){ out.println("屬性名:"+c.getName()); out.println("屬性值"+c.getValue());}在默認情況下,Cookie只能被創(chuàng)建它的應用獲取。Cookie的setPath()方法可以重新指定其訪問路徑,例如:將其設置為在某個應用下的某個路徑共享,或者在同一服務器內(nèi)的所有應用共享?!臼纠吭O置Cookie在某個應用下的訪問路徑【示例】設置Cookie在服務器下所有應用的訪問路徑Cookie的訪問路徑unameCookie.setPath("/chapter04/jsp/");unameCookie.setPath("/");Cookie有一定的存活時間,不會在客戶端一直保存。默認情況下,Cookie保存在瀏覽器內(nèi)存中,在瀏覽器關閉時失效,這種Cookie也稱為臨時Cookie(或會話Cookie)。若要使Cookie較長時間的保存在磁盤上,可以通過Cookie對象的setMaxAge()方法設置其存活時間,保存在磁盤上的Cookie也稱為持久Cookie。Cookie的存活時間Cookie對象可以通過setMaxAge()方法設置其存活時間,時間以秒為單位:時間若為正整數(shù),表示其存活的秒數(shù);時間若為負數(shù),表示其為臨時Cookie;時間若為0,表示通知瀏覽器刪除相應的Cookie。【示例】設置存活時間為1周的持久CookieCookie存活時間的設置unameCookie.setMaxAge(7*24*60*60);//參數(shù)以秒為基本單位Cookie的缺點主要集中在其安全性和隱私保護上,主要包括以下幾種:Cookie可能被禁用,當用戶非常注重個人隱私保護時,很可能會禁用瀏覽器的Cookie功能;Cookie是與瀏覽器相關的,這意味著即使訪問的是同一個頁面,不同瀏覽器之間所保存的Cookie也是不能互相訪問的;Cookie可能被刪除,因為每個Cookie都是硬盤上的一個文件,因此很有可能被用戶刪除;Cookie的大小和個數(shù)受限,單個Cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個站點最多保存20個Cookie;Cookie安全性不夠高,所有的Cookie都是以純文本的形式記錄于文件中,因此如果要保存用戶名密碼等信息時,最好事先經(jīng)過加密處理。Cookie的缺點Session技術是指使用HttpSession對象實現(xiàn)會話跟蹤的技術,是一種在服務器端保持會話跟蹤的解決方案。HttpSession對象是jakarta.servlet.http.HttpSession接口的實例,也稱為會話對象。該對象用來保存單個用戶訪問時的一些信息,是服務器在無狀態(tài)的HTTP協(xié)議下用來識別和維護具體某個用戶的主要方式。HttpSession對象會在用戶第一次訪問服務器時由容器創(chuàng)建,當用戶調(diào)用其失效方法(invalidate()方法)或超過其最大不活動時間時會失效。在此期間,用戶與服務器之間的多次請求都屬于同一個會話。服務器在創(chuàng)建會話對象時,會為其分配一個唯一的會話標識——SessionId,在用戶隨后的請求中,服務器通過讀取SessionId屬性值來識別不同的用戶,從而實現(xiàn)對每個用戶的會話跟蹤。Session技術HttpServletRequest接口提供了獲取HttpSession對象的方法:【示例】獲取HttpSession對象獲取HttpSession對象HttpSessionsession=request.getSession();或HttpSessionsession=request.getSession(true);方法描述getSession()獲取與客戶端請求關聯(lián)的當前的有效的Session,若沒有Session關聯(lián)則新建一個getSession(booleancreate)獲取與客戶端請求關聯(lián)的當前的有效的Session,若沒有Session關聯(lián),當參數(shù)為真時,Session被新建,為假時,返回空值HttpSession接口提供了存取會話域?qū)傩院凸芾頃捝芷诘姆椒ǎ篐ttpSession接口的方法方法描述voidsetAttribute(Stringkey,Objectvalue)以key/value的形式將對象保存在HttpSession對象中ObjectgetAttribute(Stringkey)通過key獲取對象值voidremoveAttribute(Stringkey)從HttpSession對象中刪除指定名稱key所對應的對象voidinvalidate()設置HttpSession對象失效voidsetMaxInactiveInterval(intinterval)設定HttpSession對象的非活動時間(以秒為單位),若超過這個時間,HttpSession對象將會失效intgetMaxInactiveInterval()獲取HttpSession對象的有效非活動時間(以秒為單位)StringgetId()獲取HttpSession對象標識sessionidlonggetCreationTime()獲取HttpSession對象產(chǎn)生的時間,單位是毫秒longgetLastAccessedTime()獲取用戶最后通過這個HttpSession對象送出請求的時間【示例】存取會話域?qū)傩裕?/存儲會話域?qū)傩?username",值為"zkl"session.setAttribute("username","zkl");//通過屬性名"username"從會話域中獲取屬性值Stringuname=(String)session.getAttribute("username");//通過屬性名將屬性從會話域中移除session.removeAttribute("username");存取會話域?qū)傩缘姆椒ā臼纠揩@取會話的最大不活動時間會話的最大不活動時間指會話超過此時間段不進行任何操作,會話自動失效的時間。HttpSession對象的最大不活動時間與容器配置有關,對于Tomcat容器,默認時間為1800秒。inttime=session.getMaxInactiveInterval();//單位為“秒”管理會話生命周期的方法通過web.xml設置會話的最大不活動時間:通過會話對象的setMaxInactiveInterval()方法設置會話的最大不活動時間:<session-config> <!--單位為“分鐘”--> <session-timeout>10</session-timeout></session-config>管理會話生命周期的方法session.setMaxInactiveInterval(600);//單位為“秒”會話對象除了在超過最大不活動時間自動失效外,也可以通過調(diào)用invalidate()方法讓其立即失效。【示例】設置會話立即失效服務器在執(zhí)行會話失效代碼后,會清除會話對象及其所有會話域?qū)傩裕瑫r響應客戶端瀏覽器清除Session。在實際應用中,此方法多用來實現(xiàn)系統(tǒng)的“安全退出”,使客戶端和服務器徹底結束此次回話,清除所有會話相關信息,防止會話劫持等黑客攻擊。session.invalidate();管理會話生命周期的方法Session生命周期經(jīng)過以下幾個過程:客戶端向服務器第一次發(fā)送請求的時候,request中并無SessionID。此時服務器會創(chuàng)建一個Session對象,并分配一個SessionID。Serssion對象保存在服務器端,此時為新建狀態(tài),調(diào)用session.isNew()返回true。當服務器端處理完畢后,會將SessionID通過response對象傳回到客戶端,瀏覽器負責保存到當前進程中。當客戶端再次發(fā)送請求時,會同時將SessionID發(fā)送給服務器。服務器根據(jù)傳遞過來的SessionID將這次請求(request)與保存在服務器端的Session對象聯(lián)系起來。此時Session已不處于新建狀態(tài),調(diào)用session.isNew()返回false。循環(huán)執(zhí)行上面3-5的過程,直到Session超時或銷毀。Session生命周期URL重寫是指服務器程序?qū)邮盏腢RL請求重新寫成網(wǎng)站可以處理的另一個URL的過程。URL重寫技術是實現(xiàn)動態(tài)網(wǎng)站會話跟蹤的重要保障。在實際應用中,當不能確定客戶端瀏覽器是否支持Cookie的情況下,使用URL重寫技術可以對請求的URL地址追加會話標識,從而實現(xiàn)用戶的會話跟蹤功能。URL重寫技術例如,對于如下格式的請求地址:經(jīng)過URL重寫后,地址格式變?yōu)椋?/p>
其中:“jsessionid”即為追加的會話標識,服務器即通過它來識別跟蹤某個用戶的訪問。URL重寫技術http://localhost:8080/ch03/EncodeURLServlethttp://localhost:8080/ch03/EncodeURLServlet;jsessionid=24666BB458B4E0A68068CC49A97FC4A9URL重寫通過HttpServletResponse的encodeURL()方法和encodeRedirectURL()方法實現(xiàn)。encodeURL()方法可以對任意請求的URL進行重寫。encodeRedirectURL()方法主要對使用sendRedirect()方法的URL進行重寫。URL重寫方法根據(jù)請求信息中是否包含“Set-Cookie”請求頭來決定是否進行URL重寫,若包含該請求頭,會將URL原樣輸出;若不包含,則會將會話標識重寫到URL中?!臼纠縠ncodeURL()方法的使用【示例】encodeRedirectURL()方法的使用URL重寫實現(xiàn)方法out.print("<ahref=’"+response.encodeURL("EncodeURLServlet")+"’>鏈接請求</a>">response.sendRedirect(response.encodeRedirectURL("EncodeURLServlet"));演示在瀏覽器Cookie禁用后,普通請求和重定向請求的URL重寫方法,以及重寫后會話標識“jsessionid”的跟蹤情況。URL重寫技術應用URL重寫技術應用注意事項:如果應用需要使用URL重寫,那么必須對應用的所有請求(包括所有的超鏈接、表單的action屬性值和重定向地址)都進行重寫,從而將jsessionid維持下來;由于瀏覽器對URL地址長度的限制,特別是在對含有查詢參數(shù)的GET請求進行URL重寫時,需要注意其總長度;由于靜態(tài)頁面不能進行會話標識的傳遞,因此所有的URL地址都必須為動態(tài)請求地址。URL重寫技術應用利用Form表單的隱藏表單域,可以在完全脫離瀏覽器對Cookie的使用限制,并且在用戶無法從頁面顯示看到隱藏標識的情況下,將標識隨請求一起傳送給服務器處理,從而實現(xiàn)會話的跟蹤?!臼纠吭贔orm表單中定義隱藏域在服務器端通過HttpServletRequest對象獲取隱藏域的值隱藏表單域<formaction="xx"method="post"> <inputtype="hidden"name="userID"value="10010"> <inputtype="submit"value="提交"></form>Stringflag=request.getParameter("userID");javax.servlet.ServletConfig接口的定義為:容器在初始化一個Servlet時,將為該Servlet創(chuàng)建一個唯一的ServletConfig對象,并將這個ServletConfig對象通過init(ServletConfigconfig)方法傳遞并保存在此Servlet對象中。ServletConfig接口的主要方法ServletConfig接口publicabstractinterface
jakarta.servlet.ServletConfig方法方法描述getInitParameter(Stringparam)根據(jù)給定的初始化參數(shù)名稱,返回匹配的初始化參數(shù)值getInitParameterNames(Stringparam)返回一個Enumeration對象,里面包含了所有的初始化參數(shù)getServletContext()返回一個ServletContext()對象getServletName()返回當前Servlet的名字,即@WebServlet的name屬性值。如果沒有配置這個屬性,則返回Servlet類的全限定名。由容器從Servlet的配置屬性(如initParams或<init-param>所指定的參數(shù))中讀取。【示例】Servlet初始化參數(shù)在web.xml文件中的配置ServletConfig接口獲取Servlet初始化參數(shù)<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.zkl.ch03.servlet.HelloServlet</servlet-class> <init-param> <param-name>url</param-name> <param-value>jdbc:oracle:thin:@localhost:1521:orcl</param-value> </init-param> <init-param> <param-name>user</param-name> <param-value>zkl</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123456</param-value> </init-param></servlet>【示例】Servlet初始化參數(shù)的獲取ServletConfig接口獲取Servlet初始化參數(shù)publicclassHelloServletextendsHttpServlet{ publicvoidinit(ServletConfigconfig)throwsServletException{ Stringurl=config.getInitParameter("url"); Stringuser=config.getInitParameter("user"); Stringpassword=config.getInitParameter("password"); try{ Connectionconn=DriverManager.getConnection(url,user,password); }catch(SQLExceptione){ e.printStackTrace(); } } ......在實際應用中,經(jīng)常會遇到一些隨需求不斷變更的信息,例如數(shù)據(jù)庫的連接地址、賬號、密碼等,若將這些信息硬編碼到Servlet類中,則信息的每次修改都將使Servlet重新編譯,這將大大降低系統(tǒng)的可維護性。這種情況可以采用Servlet的初始參數(shù)配置來解決這類問題注意jakarta.servlet.ServletContext接口的定義為:ServletContext也稱為Servlet上下文,代表當前Servlet運行環(huán)境,是Servlet與Servlet容器之間直接通信的接口;Servlet容器在啟動一個Web應用時,會為該應用創(chuàng)建一個唯一的ServletContext對象供該應用中的所有Servlet對象共享,Servlet對象可以通過ServletContext對象來訪問容器中的各種資源。
ServletContext接口publicabstractinterfacejakarta.servlet.ServletContext獲得ServletContext對象的兩種方式:通過ServletConfig接口的getServletContext()方法獲得ServletContext對象;通過GenericServlet抽象類的getServletContext()方法獲得ServletContext對象,實質(zhì)上該方法也是調(diào)用了ServletConfig的getServletContext()方法。ServletContext接口中提供了以下幾種類型的方法:獲取應用范圍的初始化參數(shù)的方法;存取應用范圍域?qū)傩缘姆椒ǎ猾@取當前Web應用信息的方法;獲取當前容器信息和輸出日志的方法;獲取服務器端文件資源的方法。ServletContext接口在Web應用開發(fā)中,可以通過web.xml配置應用范圍的初始化參數(shù),容器在應用程序加載時會讀取這些配置參數(shù),并存入ServletContext對象中。ServletContext接口中提供了以下方法:獲取應用初始化參數(shù)方法方法描述getInitParameter(Stringname)返回Web應用范圍內(nèi)匹配的初始化參數(shù)值。在web.xml中<web-app>元素中<context-param>元素表示應用范圍內(nèi)的初始化參數(shù)getInitParameterNames()返回一個包含初始化參數(shù)的Enumeration對象ServletContext對象可以理解為容器內(nèi)的一個共享空間,可以存放具有應用級別作用域的數(shù)據(jù),Web應用中的各個組件都可以共享這些數(shù)據(jù)。這些共享數(shù)據(jù)以key/value的形式存放在ServletContext對象中,并以key作為其屬性名被訪問。應用域?qū)傩缘拇嫒》椒ù嫒糜驅(qū)傩苑椒ǚ椒枋鰏etAttribute(Stringname,Objectobject)把一個對象和一個屬性名綁定并存放到ServletContext中,參數(shù)name指定屬性名,參數(shù)Object表示共享數(shù)據(jù)getAttribute(Stringname)根據(jù)參數(shù)給定的屬性名,返回一個Object類型的對象getAttributeNames()返回一個Enumeration對象,該對象包含了所有存放在ServletContext中的屬性名removeAttribute(Stringname)根據(jù)參數(shù)指定的屬性名,從ServletContext對象中刪除匹配的屬性應用域具有以下兩層含義:一是表示由Web應用的生命周期構成的時間段;二是表示在Web應用范圍內(nèi)的可訪問性。注意ServletContext對象還包含有關Web應用的信息,例如:當前Web應用的根路徑、應用的名稱、應用組件間的轉發(fā)、以及容器下其他Web應用的ServletContext對象等。Web應用信息的獲取方法獲取應用信息方法方法描述getContextPath()返回當前Web應用的根路徑getServletContextName()返回Web應用的名字。即<web-app>元素中<display-name>元素的值getRequestDispatcher(Stringpath)返回一個用于向其它Web組件轉發(fā)請求的RequestDispatcher對象getContext(Stringuripath)根據(jù)參數(shù)指定的URL返回當前Servlet容器中其他Web應
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年二手手機購買合同(三篇)
- 2025年買賣協(xié)議經(jīng)典版(2篇)
- 2025年臨時供用水協(xié)議(2篇)
- 2025年個人股份轉讓合同標準版本(三篇)
- 2025年個人房屋出租賃合同樣本(三篇)
- 2025年個人房屋購房合同標準樣本(2篇)
- 服裝店裝修承包協(xié)議
- 服裝店裝修合同范本公裝
- 農(nóng)村養(yǎng)殖場裝修協(xié)議模板
- 市政項目土石方運輸合同
- 關于餐飲合同范本
- CHT 4019-2016 城市政務電子地圖技術規(guī)范(正式版)
- 廣西壯族自治區(qū)南寧市2024年七年級下學期語文期末試卷附答案
- 微量注射泵安全使用和維護保養(yǎng)
- 建設用地土壤污染風險評估技術導則(HJ 25.3-2019代替HJ 25.3-2014)
- 高二物理人教版(2019)選擇性必修第一冊教學設計
- 部編版歷史八年級上冊 第八單元 教學設計
- JJG 692-2010無創(chuàng)自動測量血壓計
- 徐州市2023-2024學年八年級上學期期末地理試卷(含答案解析)
- 飲料對人體的危害1
- 喉癌氣管套管護理課件
評論
0/150
提交評論