HTTP是“無(wú)狀態(tài)”協(xié)議:客戶程序每次讀取Web頁(yè)面,都打開(kāi)到Web服務(wù)器的單獨(dú)的連接,并且,服務(wù)器也不自動(dòng)維護(hù)客戶的上下文信息。即使那些支持持續(xù)性(繼續(xù)使用)HTTP連接的服務(wù)器,盡管多個(gè)客戶請(qǐng)求連續(xù)發(fā)生且間隔很短時(shí)它們會(huì)保持socket打開(kāi),但是,它們也沒(méi)有維持上下文信息的內(nèi)建支持。
1. cookie
使用cookie存儲(chǔ)會(huì)話的ID,在后續(xù)的連接中,取出當(dāng)前的會(huì)話ID,并使用這個(gè)ID從服務(wù)器上的查找表(lookup table)中提取出會(huì)話的相關(guān)信息。
兩個(gè)表:將會(huì)話ID與用戶關(guān)聯(lián)起來(lái)的表、存儲(chǔ)用戶具體數(shù)據(jù)的表

然后,在接下來(lái)的請(qǐng)求中,服務(wù)器可以使用globalTable散列表,將來(lái)自JSESSIONID cookie中的會(huì)話ID與sessionInfo散列表中的用戶具體數(shù)據(jù)關(guān)聯(lián)起來(lái)。
2. URL重寫
采用這種方式時(shí),客戶程序在每個(gè)URL的尾部添加一些額外數(shù)據(jù)。這些數(shù)據(jù)標(biāo)識(shí)當(dāng)前的會(huì)話,服務(wù)器將這個(gè)標(biāo)識(shí)符與它存儲(chǔ)的用戶相關(guān)數(shù)據(jù)關(guān)聯(lián)起來(lái)。
即使瀏覽器不支持cookie或在用戶禁用cookie的情況下,URL重寫也能夠工作。
但是,URL重寫具有cookie所具有的同樣缺點(diǎn),也就是說(shuō),服務(wù)器端程序要做許多簡(jiǎn)單但是冗長(zhǎng)乏味的處理任務(wù)。
每個(gè)引用你的站點(diǎn)的URL,以及那些返回給用戶的URL(即使通過(guò)間接手段,比如服務(wù)器重定向中的Location字段)都要添加額外的信息。這種限制意味著,在你的站點(diǎn)上不能有任何靜態(tài)HTML頁(yè)面(至少靜態(tài)頁(yè)面中不能有任何鏈接到站點(diǎn)動(dòng)態(tài)頁(yè)面的鏈接)。因此,每個(gè)頁(yè)面都必須使用Servlet或JSP動(dòng)態(tài)生成。即使所有的頁(yè)面都動(dòng)態(tài)生成,如果用戶離開(kāi)了會(huì)話并通過(guò)書(shū)簽或鏈接再次回來(lái),會(huì)話的信息也會(huì)丟失,因?yàn)榇鎯?chǔ)下來(lái)的鏈接含有錯(cuò)誤的標(biāo)識(shí)信息。
3. 隱藏的表單域
<input type="hidden" name="session" value="a1234">
這個(gè)隱藏域可以用來(lái)存儲(chǔ)有關(guān)會(huì)話的信息,但它的主要缺點(diǎn)是:僅當(dāng)每個(gè)頁(yè)面都是由表單提交而動(dòng)態(tài)生成時(shí),才能使用這種方法。
單擊常規(guī)的(<a href...>)超文本鏈接并不產(chǎn)生表單提交,因此隱藏的表單域不能支持通常的會(huì)話跟蹤,只能用于一系列特定的操作中。
4. Servlet中的會(huì)話跟蹤
Servlet提供一種出色的會(huì)話跟蹤解決方案:HttpSession API。這個(gè)高層接口構(gòu)筑在cookie或URL重寫之上。所有的服務(wù)器都需要支持使用cookie的會(huì)話跟蹤,大多數(shù)服務(wù)器提供一項(xiàng)設(shè)置,可以全局地切換到URL重寫。
(完)