2-深入理解HTTP Session

session在web開(kāi)發(fā)中是一個(gè)非常重要的概念,這個(gè)概念很抽象,很難定義,也是最讓人迷惑的一個(gè)名詞,也是最多被濫用的名字之一,在不同的場(chǎng)合,session一次的含義也很不相同。這里只探討HTTP Session。

為了說(shuō)明問(wèn)題,這里基于Java Servlet理解Session的概念與原理,這里所說(shuō)Servlet已經(jīng)涵蓋了JSP技術(shù),因?yàn)镴SP最終也會(huì)被編譯為Servlet,兩者有著相同的本質(zhì)。

在Java中,HTTP的Session對(duì)象用javax.servlet.http.HttpSession來(lái)表示。

1、概念:Session代表服務(wù)器與瀏覽器的一次會(huì)話過(guò)程,這個(gè)過(guò)程是連續(xù)的,也可以時(shí)斷時(shí)續(xù)的。在Servlet中,session指的是HttpSession類(lèi)的對(duì)象,這個(gè)概念到此結(jié)束了,也許會(huì)很模糊,但只有看完本文,才能真正有個(gè)深刻理解。

2、Session創(chuàng)建的時(shí)間是:

一個(gè)常見(jiàn)的誤解是以為session在有客戶(hù)端訪問(wèn)時(shí)就被創(chuàng)建,然而事實(shí)是直到某server端程序調(diào)用 HttpServletRequest.getSession(true)這樣的語(yǔ)句時(shí)才被創(chuàng)建,注意如果JSP沒(méi)有顯示的使用 <% @page session="false"%> 關(guān)閉session,則JSP文件在編譯成Servlet時(shí)將會(huì)自動(dòng)加上這樣一條語(yǔ)句 HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的 session對(duì)象的來(lái)歷。

由于session會(huì)消耗內(nèi)存資源,因此,如果不打算使用session,應(yīng)該在所有的JSP中關(guān)閉它。

引申:

1)、訪問(wèn)*.html的靜態(tài)資源因?yàn)椴粫?huì)被編譯為Servlet,也就不涉及session的問(wèn)題。

2)、當(dāng)JSP頁(yè)面沒(méi)有顯式禁止session的時(shí)候,在打開(kāi)瀏覽器第一次請(qǐng)求該jsp的時(shí)候,服務(wù)器會(huì)自動(dòng)為其創(chuàng)建一個(gè)session,并賦予其一個(gè)sessionID,發(fā)送給客戶(hù)端的瀏覽器。以后客戶(hù)端接著請(qǐng)求本應(yīng)用中其他資源的時(shí)候,會(huì)自動(dòng)在請(qǐng)求頭上添加:

Cookie:JSESSIONID=客戶(hù)端第一次拿到的session ID

這樣,服務(wù)器端在接到請(qǐng)求時(shí)候,就會(huì)收到session ID,并根據(jù)ID在內(nèi)存中找到之前創(chuàng)建的session對(duì)象,提供給請(qǐng)求使用。這也是session使用的基本原理----搞不懂這個(gè),就永遠(yuǎn)不明白session的原理。

下面是兩次請(qǐng)求同一個(gè)jsp,請(qǐng)求頭信息:

圖片.png

通過(guò)圖可以清晰發(fā)現(xiàn),第二次請(qǐng)求的時(shí)候,已經(jīng)添加session ID的信息。

3、Session刪除的時(shí)間是:

1)Session超時(shí):超時(shí)指的是連續(xù)一定時(shí)間服務(wù)器沒(méi)有收到該Session所對(duì)應(yīng)客戶(hù)端的請(qǐng)求,并且這個(gè)時(shí)間超過(guò)了服務(wù)器設(shè)置的Session超時(shí)的最大時(shí)間。

2)程序調(diào)用HttpSession.invalidate()

3)服務(wù)器關(guān)閉或服務(wù)停止

4、session存放在哪里:服務(wù)器端的內(nèi)存中。不過(guò)session可以通過(guò)特殊的方式做持久化管理。

5、session的id是從哪里來(lái)的,sessionID是如何使用的:當(dāng)客戶(hù)端第一次請(qǐng)求session對(duì)象時(shí)候,服務(wù)器會(huì)為客戶(hù)端創(chuàng)建一個(gè)session,并將通過(guò)特殊算法算出一個(gè)session的ID,用來(lái)標(biāo)識(shí)該session對(duì)象,當(dāng)瀏覽器下次(session繼續(xù)有效時(shí))請(qǐng)求別的資源的時(shí)候,瀏覽器會(huì)偷偷地將sessionID放置到請(qǐng)求頭中,服務(wù)器接收到請(qǐng)求后就得到該請(qǐng)求的sessionID,服務(wù)器找到該id的session返還給請(qǐng)求者(Servlet)使用。一個(gè)會(huì)話只能有一個(gè)session對(duì)象,對(duì)session來(lái)說(shuō)是只認(rèn)id不認(rèn)人。

6、session會(huì)因?yàn)闉g覽器的關(guān)閉而刪除嗎?

不會(huì),session只會(huì)通過(guò)上面提到的方式去關(guān)閉。

7、同一客戶(hù)端機(jī)器多次請(qǐng)求同一個(gè)資源,session一樣嗎?

一般來(lái)說(shuō),每次請(qǐng)求都會(huì)新創(chuàng)建一個(gè)session。

其實(shí),這個(gè)也不一定的,總結(jié)下:對(duì)于多標(biāo)簽的瀏覽器(比如360瀏覽器)來(lái)說(shuō),在一個(gè)瀏覽器窗口中,多個(gè)標(biāo)簽同時(shí)訪問(wèn)一個(gè)頁(yè)面,session是一個(gè)。對(duì)于多個(gè)瀏覽器窗口之間,同時(shí)或者相隔很短時(shí)間訪問(wèn)一個(gè)頁(yè)面,session是多個(gè)的,和瀏覽器的進(jìn)程有關(guān)。對(duì)于一個(gè)同一個(gè)瀏覽器窗口,直接錄入url訪問(wèn)同一應(yīng)用的不同資源,session是一樣的。

8、session是一個(gè)容器,可以存放會(huì)話過(guò)程中的任何對(duì)象。

9、session因?yàn)檎?qǐng)求(request對(duì)象)而產(chǎn)生,同一個(gè)會(huì)話中多個(gè)request共享了一session對(duì)象,可以直接從請(qǐng)求中獲取到session對(duì)象。

10、其實(shí),session的創(chuàng)建和使用總在服務(wù)端,而瀏覽器從來(lái)都沒(méi)得到過(guò)session對(duì)象。但瀏覽器可以請(qǐng)求Servlet(jsp也是Servlet)來(lái)獲取session的信息??蛻?hù)端瀏覽器真正緊緊拿到的是session ID,而這個(gè)對(duì)于瀏覽器操作的人來(lái)說(shuō),是不可見(jiàn)的,并且用戶(hù)也無(wú)需關(guān)心自己處于哪個(gè)會(huì)話過(guò)程中。

本文出自 “熔 巖” 博客,請(qǐng)務(wù)必保留此出處http://lavasoft.blog.51cto.com/62575/275589

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • session在web開(kāi)發(fā)中是一個(gè)非常重要的概念,這個(gè)概念很抽象,很難定義,也是最讓人迷惑的一個(gè)名詞,也是最多被濫...
    沉默的金魚(yú)閱讀 489評(píng)論 0 1
  • session在web開(kāi)發(fā)中是一個(gè)非常重要的概念,這個(gè)概念很抽象,很難定義,也是最讓人迷惑的一個(gè)名詞,也是最多被濫...
    曹波波閱讀 572評(píng)論 0 0
  • 目錄Cookie機(jī)制什么是CookieCookie的不可跨域名性Unicode編碼:保存中文BASE64編碼:保存...
    Tomatoro閱讀 17,044評(píng)論 7 186
  • 會(huì)話(Session)跟蹤是Web程序中常用的技術(shù),用來(lái)跟蹤用戶(hù)的整個(gè)會(huì)話。常用的會(huì)話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,786評(píng)論 1 49
  • 2018 6.25 星期一 天氣陰 今天陰沉沉的悶熱!送下孩子去上班,中午還好沒(méi)接晚,到...
    往事隨風(fēng)_452e閱讀 211評(píng)論 0 0

友情鏈接更多精彩內(nèi)容