瞭解Session

爲什麼需要session

    談及session一般是在web應用的背景之下,我們知道web應用是基於HTTP協議的,而HTTP協議恰恰是一種無狀態協議。也就是說,用戶從A頁面跳轉到B頁面會重新發送一次HTTP請求,而服務端在返回響應的時候是無法獲知該用戶在請求B頁面之前做了什麼的。

    對於HTTP的無狀態性的原因,相關RFC裏並沒有解釋,但聯繫到HTTP的歷史以及應用場景,我們可以推測出一些理由:

1.   設計HTTP最初的目的是爲了提供一種發佈和接收HTML頁面的方法。那個時候沒有動態頁面技術,只有純粹的靜態HTML頁面,因此根本不需要協議能保持狀態;

2.   用戶在收到響應時,往往要花一些時間來閱讀頁面,因此如果保持客戶端和服務端之間的連接,那麼這個連接在大多數的時間裏都將是空閒的,這是一種資源的無端浪費。所以HTTP原始的設計是默認短連接,即客戶端和服務端完成一次請求和響應之後就斷開TCP連接,服務器因此無法預知客戶端的下一個動作,它甚至都不知道這個用戶會不會再次訪問,因此讓HTTP協議來維護用戶的訪問狀態也全然沒有必要;

3.   將一部分複雜性轉嫁到以HTTP協議爲基礎的技術之上可以使得HTTP在協議這個層面上顯得相對簡單,而這種簡單也賦予了HTTP更強的擴展能力。事實上,session技術從本質上來講也是對HTTP協議的一種擴展。

總而言之,HTTP的無狀態是由其歷史使命而決定的。但隨着網絡技術的蓬勃發展,人們再也不滿足於死板乏味的靜態HTML,他們希望web應用能動起來,於是客戶端出現了腳本和DOM技術,HTML裏增加了表單,而服務端出現了CGI等等動態技術。

而正是這種web動態化的需求,給HTTP協議提出了一個難題:一個無狀態的協議怎樣才能關聯兩次連續的請求呢?也就是說無狀態的協議怎樣才能滿足有狀態的需求呢?

此時有狀態是必然趨勢而協議的無狀態性也是木已成舟,因此我們需要一些方案來解決這個矛盾,來保持HTTP連接狀態,於是出現了cookie和session。



  Session創建的時間是:

一個常見的誤解是以爲session在有客戶端訪問時就被創建,然而事實是直到某server端程序調用 HttpServletRequest.getSession(true)這樣的語句時才被創建,
注意如果JSP沒有顯示的使用 <% @page session="false"%> 關閉session,則JSP文件在編譯成Servlet時將會自動加上這樣一條語句
 HttpSession session = HttpServletRequest.getSession(true);這也是JSP中隱含的 session對象的來歷。
由於session會消耗內存資源,因此,如果不打算使用session,應該在所有的JSP中關閉它。

  引申:
1)、訪問*.html的靜態資源因爲不會被編譯爲Servlet,也就不涉及session的問題。
2)、當JSP頁面沒有顯式禁止session的時候,在打開瀏覽器第一次請求該jsp的時候,服務器會自動爲其創建一個session,並賦予其一個sessionID,
發送給客戶端的瀏覽器。以後客戶端接着請求本應用中其他資源的時候,會自動在請求頭上添加:
Cookie:JSESSIONID=客戶端第一次拿到的session ID
這樣,服務器端在接到請求時候,就會收到session ID,並根據ID在內存中找到之前創建的session對象,提供給請求使用

當一個頁面第二次請求同一頁面時,服務器會尋找之前創建的sesssion id,  並加載到請求頭


  Session刪除的時間是:

1)Session超時:超時指的是連續一定時間服務器沒有收到該Session所對應客戶端的請求,並且這個時間超過了服務器設置的Session超時的最大時間。
2)程序調用HttpSession.invalidate()
3)服務器關閉或服務停止


  session存放在哪裏:服務器端的內存中

 

  session會因爲瀏覽器的關閉而刪除嗎? 不會,session只會通過上面提到的方式去關閉。


  同一客戶端機器多次請求同一個資源,session一樣嗎? 一般來說,每次請求都會新創建一個session。

總結下:對於多標籤的瀏覽器(比如360瀏覽器)來說,在一個瀏覽器窗口中,多個標籤同時訪問一個頁面,session是一個。對於多個瀏覽器窗口之間,

同時或者相隔很短時間訪問一個頁面,session是多個的,和瀏覽器的進程有關。對於一個同一個瀏覽器窗口,直接錄入url訪問同一應用的不同資源,session是一樣的。


session是一個容器,可以存放會話過程中的任何對象。


session的創建和使用總在服務端,而瀏覽器從來都沒得到過session對象。但瀏覽器可以請求Servlet(jsp也是Servlet)來獲取session的信息。

客戶端瀏覽器真正緊緊拿到的是session ID,而這個對於瀏覽器操作的人來說,是不可見的,並且用戶也無需關心自己處於哪個會話過程中。

    
session的id是從哪裏來的,sessionID是如何使用的:當客戶端第一次請求session對象時候,服務器會爲客戶端創建一個session,並將通過特殊算法算出一個session的ID,用來標識該session對象,當瀏覽器下次(session繼續有效時)請求別的資源的時候,瀏覽器會偷偷地將sessionID放置到請求頭中,服務器接收到請求後就得到該請求的sessionID,服務器找到該id的session返還給請求者(Servlet)使用。一個會話只能有一個session對象,對session來說是隻認id不認人

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章