一篇優(yōu)秀Session講解
摘要:雖然session機(jī)制在web應(yīng)用程序中被采用已經(jīng)很長(zhǎng)時(shí)間了,但是仍然有很多人不清楚session機(jī)制的本質(zhì),以至不能正確的應(yīng)用這一技術(shù)。本文將詳細(xì)討論session的工作機(jī)制并且對(duì)在Java
摘要:雖然session機(jī)制在web應(yīng)用程序中被采用已經(jīng)很長(zhǎng)時(shí)間了,但是仍然有很多人不清楚session機(jī)制的本質(zhì),以至不能正確的應(yīng)用這一技術(shù)。本文將詳細(xì)討論session的工作機(jī)制并且對(duì)在Java web application中應(yīng)用session機(jī)制時(shí)常見(jiàn)的問(wèn)題作出解答。
目錄:
一、術(shù)語(yǔ)session
二、HTTP協(xié)議與狀態(tài)保持
三、理解cookie機(jī)制
四、理解session機(jī)制
五、理解javax.servlet.http.HttpSession
六、HttpSession常見(jiàn)問(wèn)題
七、跨應(yīng)用程序的session共享
八、總結(jié)
參考文檔
一、術(shù)語(yǔ)session
在我的經(jīng)驗(yàn)里,session這個(gè)詞被濫用的程度大概僅次于transaction,更加有趣的是transaction與session在某些語(yǔ)境下的含義是相同的。
session,中文經(jīng)常翻譯為會(huì)話,其本來(lái)的含義是指有始有終的一系列動(dòng)作/消息,比如打電話時(shí)從拿起電話撥號(hào)到掛斷電話這中間的一系列過(guò)程可以稱(chēng)之為一個(gè) session。有時(shí)候我們可以看到這樣的話“在一個(gè)瀏覽器會(huì)話期間,...”,這里的會(huì)話一詞用的就是其本義,是指從一個(gè)瀏覽器窗口打開(kāi)到關(guān)閉這個(gè)期間 ①。最混亂的是“用戶(hù)(客戶(hù)端)在一次會(huì)話期間”這樣一句話,它可能指用戶(hù)的一系列動(dòng)作(一般情況下是同某個(gè)具體目的相關(guān)的一系列動(dòng)作,比如從登錄到選購(gòu)商品到結(jié)賬登出這樣一個(gè)網(wǎng)上購(gòu)物的過(guò)程,有時(shí)候也被稱(chēng)為一個(gè)transaction),然而有時(shí)候也可能僅僅是指一次連接,也有可能是指含義①,其中的差別只能靠上下文來(lái)推斷②。
然而當(dāng)session一詞與網(wǎng)絡(luò)協(xié)議相關(guān)聯(lián)時(shí),它又往往隱含了“面向連接”和/或“保持狀態(tài)”這樣兩個(gè)含義, “面向連接”指的是在通信雙方在通信之前要先建立一個(gè)通信的渠道,比如打電話,直到對(duì)方接了電話通信才能開(kāi)始,與此相對(duì)的是寫(xiě)信,在你把信發(fā)出去的時(shí)候你并不能確認(rèn)對(duì)方的地址是否正確,通信渠道不一定能建立,但對(duì)發(fā)信人來(lái)說(shuō),通信已經(jīng)開(kāi)始了?!氨3譅顟B(tài)”則是指通信的一方能夠把一系列的消息關(guān)聯(lián)起來(lái),使得消息之間可以互相依賴(lài),比如一個(gè)服務(wù)員能夠認(rèn)出再次光臨的老顧客并且記得上次這個(gè)顧客還欠店里一塊錢(qián)。這一類(lèi)的例子有“一個(gè)TCP session”或者 “一個(gè)POP3 session”③。
而到了web服務(wù)器蓬勃發(fā)展的時(shí)代,session在web開(kāi)發(fā)語(yǔ)境下的語(yǔ)義又有了新的擴(kuò)展,它的含義是指一類(lèi)用來(lái)在客戶(hù)端與服務(wù)器之間保持狀態(tài)的解決方案④。有時(shí)候session也用來(lái)指這種解決方案的存儲(chǔ)結(jié)構(gòu),如“把xxx保存在session 里”⑤。由于各種用于web開(kāi)發(fā)的語(yǔ)言在一定程度上都提供了對(duì)這種解決方案的支持,所以在某種特定語(yǔ)言的語(yǔ)境下,session也被用來(lái)指代該語(yǔ)言的解決方案,比如經(jīng)常把Java里提供的javax.servlet.http.HttpSession簡(jiǎn)稱(chēng)為session⑥