課件-cookie與主要內(nèi)容_第1頁
課件-cookie與主要內(nèi)容_第2頁
課件-cookie與主要內(nèi)容_第3頁
課件-cookie與主要內(nèi)容_第4頁
課件-cookie與主要內(nèi)容_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

主要內(nèi)容:1.理解會話與會話狀態(tài)的管理2.

技術(shù)3.session技術(shù)4.

應(yīng)用

與session技術(shù)提出問題HTTP協(xié)議是一種無狀態(tài)的協(xié)議,WEB服務(wù)器本身不能識別出哪些請求是同一個瀏覽器發(fā)出的,瀏覽器的每一次請求都是完全孤立的即使HTTP1.1

支持持續(xù)連接,但當(dāng)用戶有一段時間沒有提交請求,連接也會關(guān)閉。網(wǎng)上商店的購物車功能如何實現(xiàn)?:加入購物車的商品在下次再查看時還在瀏覽記錄功能如何實現(xiàn)?:

你查看過的

都顯示在瀏覽記錄列表中作為web

服務(wù)器,必須能夠采用一種機(jī)制來唯一地標(biāo)識一個用戶,同時記錄該用戶的狀態(tài)提出問題HTTP協(xié)議是一種無狀態(tài)的協(xié)議,WEB服務(wù)器本身不能識別出哪些請求是同一個瀏覽器發(fā)出的,瀏覽器的每一次請求都是完全孤立的即使HTTP1.1

支持持續(xù)連接,但當(dāng)用戶有一段時間沒有提交請求,連接也會關(guān)閉。網(wǎng)上商店的購物車功能如何實現(xiàn)?:加入購物車的商品在下次再查看時還在瀏覽記錄功能如何實現(xiàn)?:

你查看過的

都顯示在瀏覽記錄列表中作為web

服務(wù)器,必須能夠采用一種機(jī)制來唯一地標(biāo)識一個用戶,同時記錄該用戶的狀態(tài)會話和會話狀態(tài)WEB應(yīng)用中的會話是指一個客戶端瀏覽器與WEB服務(wù)器之間連續(xù)發(fā)生的一系列請求和響應(yīng)過程。WEB應(yīng)用的會話狀態(tài)是指WEB服務(wù)器與瀏覽器在會話過

產(chǎn)生的狀態(tài)信息,借助會話狀態(tài),WEB服務(wù)器能夠把屬于同一會話中的一系列的請求和響應(yīng)過程關(guān)聯(lián)起來。session如何實現(xiàn)有狀態(tài)的會話WEB服務(wù)器端程序要能從大量的請求消息中區(qū)分出哪些請求消息屬于同一個會話,即能識別出來自同一個瀏覽器的

請求,這需要瀏覽器對其發(fā)出的每個請求消息都進(jìn)行標(biāo)識:屬于同一個會話中的請求消息都附帶同樣的標(biāo)識號,而屬于不同會話的請求消息總是附帶不同的標(biāo)識號,這個標(biāo)識號就稱之為會話ID(SessionID)。在Servlet

規(guī)范中,常用以下兩種機(jī)制完成會話(瀏覽器端的緩存技術(shù))Session(服務(wù)器端和瀏覽器端的緩存技術(shù))的應(yīng)用案例:最近瀏覽記錄session的應(yīng)用案例:購物車session的應(yīng)用案例:用戶的自動登陸機(jī)制??機(jī)制采用的是在客戶端保持HTTP

狀態(tài)信息的方案是在瀏覽器

WEB服務(wù)器的某個資源時,由WEB服務(wù)器在HTTP響應(yīng)消息頭中附帶傳送給瀏覽器的一個小文本文件。該WEB服務(wù)器時,一旦WEB瀏覽器保存了某個都會在HTTP請求頭中將這個,那么它在以后每次回傳給WEB服務(wù)器。底層的實現(xiàn)原理:

WEB服務(wù)器通過在HTTP響應(yīng)消息中增加Set-

響應(yīng)頭字段將請求頭字段將給瀏覽器,瀏覽器則通過在HTTP請求消息中增加回傳給WEB服務(wù)器。一個 只能標(biāo)識一種信息,它至少含有一個標(biāo)識該信息的名稱(NAME)和設(shè)置值(VALUE)。一個WEB站點可以給一個WEB瀏覽器發(fā)送多個 ,一個WEB瀏覽器也。,每個站點最多存放20個,每個可以 多個WEB站點提供的瀏覽器一般只允許存放300個的大小限制為4KB。的傳送過程示意圖不存在①第一次Server1的④寫入Server1的③第一次響應(yīng)Set- 2:

name=value②第一次請求WEBServer1WEBServer2瀏覽器Server1的Server2的區(qū)⑤后續(xù) 存在Server1的⑥后續(xù)請求:

name=value類信息,它Servlet

API中提供了一個javax.servlet.http.

類來封裝包含有生成 信息和提取 信息的各個屬性的方法。?(String

name,String

value)類的方法:構(gòu)造方法:publicgetName方法setValue與getValue方法setMaxAgesetPathHttpServletResponse接口中定義了一個add

方法,它用于在發(fā)送給瀏覽器的HTTP響應(yīng)消息中增加一個Set-

響應(yīng)頭字段。HttpServletRequest接口中定義了一個get

s方法,它用于從HTTP請求消息的 請求頭字段中 所有的 項。的回送1.創(chuàng)建

對象2.設(shè)置最大時效3.將 放入到HTTP響應(yīng)報頭如果創(chuàng)建了一個

,并將他發(fā)送到瀏覽器,默認(rèn)情況下它是一個會話級別的

;

在瀏覽器的內(nèi)存中,用戶退出瀏覽器之后被刪除。若希望瀏覽器將該

在磁盤上,則需要使用maxAge,并給出一個以秒為單位的時間。將最大時效設(shè)為0則是命令瀏覽器刪除該

。發(fā)送

需要使用HttpServletResponse的add

方法,將到一個

Set-

HTTP響應(yīng)報頭中。由于這個方法并不修改任何之前指定的Set-

報頭,而是創(chuàng)建新的報頭,因此將這個方法稱為是add

,而非set

。的1.調(diào)用request.gets()要獲取瀏覽器發(fā)送來的,需要調(diào)用HttpServletRequest的get

s方法,這個調(diào)用返回

對象的數(shù)組,對應(yīng)由HTTP請求中

報頭輸入的值。2.對數(shù)組進(jìn)行循環(huán),調(diào)用每個的getName方法,直到找到感的為止會話

和持久的區(qū)別如果不設(shè)置過期時間,則表示這個生命周期為瀏覽器會話期間,只要關(guān)閉瀏覽器窗口,就 了。這種生命期為瀏覽器會話期的 被稱為會話。會話一般不保存在硬盤上而是保存在內(nèi)存里。?如果設(shè)置了過期時間,瀏覽器就會把保存到硬盤上,關(guān)閉后再次打開瀏覽器,這些依然有效直到超過設(shè)定的過期時間。在硬盤上的可以在不同的瀏覽器進(jìn)程間共享,比如兩個IE窗口。而對于保存在內(nèi)存的,不同的瀏覽器有不同的處理方式。之項目實戰(zhàn)(6)功能需求:顯示

瀏覽記錄1).

顯示 的瀏覽記錄(最多顯示4條,

最后瀏覽的 面)2).可以清空瀏覽記錄session在不同環(huán)境下的不同含義session,中文經(jīng)常翻譯為會話,其本來的含義是指有始有終的一系列動作/消息,對瀏覽來說是指:從打開瀏覽發(fā)送請求開始,到關(guān)閉瀏覽器窗口為止。session在Web開發(fā)環(huán)境下的語義又有了新的擴(kuò)展,它的含義是指一類用來在客戶端與服務(wù)器端之間保持狀態(tài)的解決方案。Session有時候也用來指這種解決方案的 結(jié)構(gòu),

也就是HttpSession接口對象Session機(jī)制session機(jī)制采用的是在服務(wù)器端保持

HTTP

狀態(tài)信息的方案。服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來保存信息。當(dāng)程序需要為某個客戶端的請求創(chuàng)建一個session時,服務(wù)器首先檢查這

個客戶端的請求里是否包含了一個session標(biāo)識(即sessionId),如果已經(jīng)包

含一個sessionId則說明以前已經(jīng)為此客戶創(chuàng)建過session,服務(wù)器就按照

session

id把這個session檢索出來使用(如果檢索不到,可能會新建一個,這種情況可能出現(xiàn)在服務(wù)端已經(jīng)刪除了該用戶對應(yīng)的session對象,但用

戶人為地在請求的URL后面附加上一個JSESSION的參數(shù))。如果客戶請求不包含sessionId,

則為此客戶創(chuàng)建一個session

并且生成一個與此

session相關(guān)聯(lián)的sessionId,這個session

id將在本次響應(yīng)中返回給客戶

端保存。JESSESIONID=eriereidfd3243Session的交互過程不存①當(dāng)前會話第一次在JSESSIONID的④寫入Server1的③第一次響應(yīng)Set-

2:JSESSIONID=

x②第一次請求WEBServer1瀏覽器Server1的區(qū)⑤后續(xù)存在Server1的⑥后續(xù)請求:

JSESSIONID=

x獲取session時,會創(chuàng)建session對象(sessionid=

x)獲取session時不會新建,而是根據(jù)JSESSIONID的值

x找到對應(yīng)的session對象HttpSession接口中的方法getId方法getCreationTime方法getLastAccessedTime方法setMaxInactiveInterval方法getMaxInactiveInterval方法isNew方法*如果客戶端請求消息中返回了一個與Servlet程序當(dāng)前獲得的HttpSession對象的會話標(biāo)識號相同的會話標(biāo)識號,則認(rèn)為這個HttpSession對象不是新建的。invalidate方法getServletContext方法setAttribute方法getAttribute方法removeAttribute方法getAttributeNames方法Request.getSession();Session的創(chuàng)建與刪除一個常見的錯誤是以為session在有客戶端 時就被創(chuàng)建,然而事實是直到某server端程序(如Servlet)調(diào)用HttpServletRequest.getSession(true)

或者HttpServletRequest.getSession()這樣的語句時才會被創(chuàng)建。session在下列情況下被刪除:A.程序調(diào)用HttpSession.invalidate()B.距離上一次收到客戶端發(fā)送的session

id時間間隔超過了session的最大有效時間C.服務(wù)器進(jìn)程被停止注意:關(guān)閉瀏覽器只會使

在客戶端瀏覽器內(nèi)存中的session失效,不會使服務(wù)器端的session對象失效。兩個瀏覽器窗口 應(yīng)用程序會使用同一個session通常session

是不能跨窗口使用的(IE

8

版本以前),當(dāng)你新開了一個瀏覽器窗口進(jìn)入相同頁面時,系統(tǒng)會賦予你一個新的sessionid,這樣信息共享的目的就達(dá)不到了。此時可以先把session

id保存在persistent

中(通過設(shè)置

的最大有效時間),然后在新窗口中讀出來,就可以得到上一個窗口的sessionid了,這樣通過session和persistent

的結(jié)合就可以實現(xiàn)了跨窗口的會話

。保存session

id的幾種方式保存session

id的方式可以采用

,這樣在交互過瀏覽器可以自動的按照規(guī)則把這個標(biāo)識發(fā)送給服務(wù)器。由于可以

為的禁用,必須有其它的機(jī)制以便在

被禁用時仍然能夠把sessionid傳遞回服務(wù)器,經(jīng)常采用的一種技術(shù)叫做URL重寫,就是把sessionid附加在URL路徑的后面,附加的方式也有兩種,一種是作為URL路徑的附加信息,另一種是作為查詢字符串附加在URL后面。網(wǎng)絡(luò)在整個交互過始終保持狀態(tài),就必須在每個客戶端可能請求的路徑后面都包含這個session

id。Sessionsession通過SessionID來區(qū)分不同的客戶,session是以或URL重寫為基礎(chǔ)的,默認(rèn)使用

來實現(xiàn),系統(tǒng)會創(chuàng)造一個名為JSESSIONID的輸出

,這稱之為session

,以區(qū)別persistent s(也就是

通常所說的),session

是于瀏覽器內(nèi)存中的,并不是寫到硬盤上的,通??床坏絁SESSIONID,但是當(dāng)把瀏覽器的后,web服務(wù)器會采用URL重寫的方式傳遞Sessionid,這時地址欄看到session

針對某一次會話而言,會話結(jié)束session也就隨著 了,而persistent

只是存在于客戶端硬盤上的一段文本。關(guān)閉瀏覽器,只會是瀏覽器端內(nèi)存里的session

,但不會使保存在服務(wù)器端的session對象

,同樣也不會使已經(jīng)保存到硬盤上的持久化

。Session的超時管理WEB服務(wù)器無法判斷當(dāng)前的客戶端瀏覽器是否還會繼續(xù),也無法檢測客戶端瀏覽器是否關(guān)閉,所以,即使客戶已經(jīng)離開或關(guān)閉了瀏覽器,WEB服務(wù)器還要保留與之對應(yīng)的HttpSession對象。隨著時間的推移而不斷增加新的客戶端,WEB服務(wù)器內(nèi)存中將會因此積累起大量的不再被使用的HttpSession對象,并將最終導(dǎo)致服務(wù)器內(nèi)存耗盡。WEB服務(wù)器采用“超時限制”的辦法來判斷客戶端是否還在繼續(xù) ,如果某個客戶端在一定的時間之內(nèi)沒有發(fā)出后續(xù)請求,WEB服務(wù)器則認(rèn)為客戶端已經(jīng)停止了活動,結(jié)束與該客戶端的會話并將與之對應(yīng)的HttpSession對象變成 。如果客戶端瀏覽器超時后再次發(fā)出

請求,WEB服務(wù)器則認(rèn)為這是一個新的會話的開始,將為之創(chuàng)建新的HttpSession對象和分配新的會話標(biāo)識號。會話的超時間隔可以在web.xml文件中設(shè)置,其默認(rèn)值由Servlet容器定義。<session-config><session-timeout>30</session-timeout></session-config>利用URL重寫實現(xiàn)SessionServlet規(guī)范中引入了一種補充的會話管理機(jī)制,它允許不支持 的瀏覽器也可以與WEB服務(wù)器保持連續(xù)的會話。這種補充機(jī)制要求在響應(yīng)消息的實體內(nèi)容中必須包含下一次請求的超 ,并將會話標(biāo)識號作為超

的URL地址的一個特殊參數(shù)。將會話標(biāo)識號以參數(shù)形式附加在超

的URL地址后面的技術(shù)稱為URL重寫。如果在瀏覽器不支持 或者關(guān)閉了 功能的情況下,WEB服務(wù)器還要能夠與瀏覽器實現(xiàn)有狀態(tài)的會話,就必須對所有可能被客戶端 的請求路徑(包括超

、form表單的action屬性設(shè)置和重定向的URL)進(jìn)行URL重寫。HttpServletResponse接口中定義了兩個用于完成URL重寫方法:encodeURL方法encodeRedirectURL方法HttpSession

的生命周期什么時候創(chuàng)建

HttpSession

對象是否瀏覽器 服務(wù)端的任何一個

JSP

Servlet,服務(wù)器都會立即創(chuàng)建一個

HttpSession

對象呢?不一定。若當(dāng)前的

JSP(或

Servlet)

是客戶端 的當(dāng)前

WEB

應(yīng)用的第一個資源,且

JSP

page

指定的session

屬性值為

false,

則服務(wù)器就不會為

JSP

創(chuàng)建一個

HttpSession對象;若當(dāng)前

JSP

不是客戶端 的當(dāng)前

WEB

應(yīng)用的第一個資源,且其他頁面已經(jīng)創(chuàng)建一個

HttpSession

對象,則當(dāng)前

JSP

頁面會返回一個會話的

HttpSession

對象,而不會創(chuàng)建一個新的

HttpSession‘

對象session=“false“到底表示什么意思?當(dāng)前JSP

頁面禁用session

隱含變量!但可以使用其他的顯式的

HttpSession

對象對于

Serlvet

而言:若

Serlvet

是客戶端

的第一個

WEB

應(yīng)用的資源,則只有調(diào)用了

request.getSession()或request.getSession(true)才會創(chuàng)建

HttpSession

對象什么時候銷毀

HttpSession

對象:JSESSIOINID=Sessionrequest.getSession()id

=

request.get

(“JSESSIOINID”)session

=

sessionMap.get(id);if(session==null)

{session

=

new

HttpSessionImpl(newId)c

=

new

(“JSESSIONID,

newId);response.add

(c);}return

sessionid1=session1id2=session2Session的結(jié)構(gòu)id,

Map<String,Object>attributes表單的重復(fù)提交?在沒有刷新表單頁面的情況下多次提交了請求1.快速點擊提交按鈕(服務(wù)器處理慢)2.請求處理完成后(轉(zhuǎn)發(fā)),再次點擊瀏覽器的”刷新”按鈕3.點擊瀏覽器的回退按鈕,不刷新表單頁面,再次點擊提交按鈕問題:1.給服務(wù)器添加了不必要的壓力2.有可能出現(xiàn)錯誤操作解決方法一:JS

客戶端避免表單重復(fù)提交不足:只能解決第一種情況的問題解決方法二:使用請求的重定向不足:只能解決第二種情況的問題解決方法三:使用Session現(xiàn)實事例:

一位乘客在

火車站買了一張去

的火車票(直接刷的那種),他刷票進(jìn)站坐火車去了

,

回來后過了幾天,

他又需要去這次他不想再買票,

直接拿上次的票去進(jìn)站口刷,

檢票機(jī)提示“此火車票已使用過了”,

不能能進(jìn)站.牛人A火車票務(wù)系統(tǒng)在窗口請求買張火車票生成一個隨機(jī)唯一的id,作為票號,并保存(db)印一新的票,票上有id(123)及相關(guān)信息,給乘客得到一張火車票火車票id=123拿著火車票去刷票進(jìn)站在系統(tǒng)中看是否存在此id的記錄?有,刪除保存的id記錄,并通過,沒有,此票已使用過了,不能通過下次再拿著上次的票去刷票進(jìn)站利用Session防止表單重復(fù)提交包含有FORM表單的頁面必須通過一個服務(wù)器程序動態(tài)產(chǎn)生,服務(wù)器程序為每次產(chǎn)生的頁面中的FORM表單都分配一個唯一的隨機(jī)標(biāo)識號,并在FORM表單的一個隱藏字段中設(shè)置這個標(biāo)識號,同時在當(dāng)前用戶的Session域中保存這個標(biāo)識號。當(dāng)用戶提交FORM表單時,負(fù)責(zé)接收這一請求的服務(wù)器程序比較FORM表單隱藏字段中的標(biāo)識號與 在當(dāng)前用戶的Session域中的標(biāo)識號是否相同,如果的標(biāo)識號。相同則處理表單數(shù)據(jù),處理完后清除當(dāng)前用戶的Session域中在下列情況下,服務(wù)器

溫馨提示

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

最新文檔

評論

0/150

提交評論