Session和Cookie的聯絡與區別

橙子筆記發表於2017-10-20

一、cookie的機制
      cookie是由伺服器端生成,傳送給客戶端(一般是瀏覽器),瀏覽器會將cookie的key/value儲存在客戶端硬碟上的一段文字(通常是加密的),下次請求同一網站時就傳送該cookie給伺服器(前提是瀏覽器設定為啟用cookie)。cookie的內容主要包括:名字、值、過期時間、路徑和域。路徑和域一起構成cookie的作用範圍。如果不設定過期時間,則表示這個cookie生命週期為瀏覽器會話期間,只要關閉瀏覽器視窗,cookie就消失了。

二、會話cookie和持久cookie的區別
  生命期為瀏覽會話期的cookie被稱為會話cookie。會話cookie一般不儲存在硬碟上而是儲存在記憶體裡。如果設定了過期時間,瀏覽器就會把cookie儲存到硬碟上,關閉後再次開啟瀏覽器,這些cookie依然有效直到超過設定的過期時間。儲存在硬碟上的cookie可以在不同的瀏覽器程式間共享,比如兩個IE視窗。而對於儲存在記憶體的cookie,不同的瀏覽器有不同的處理方式。
   
三、cookie的傳送
1.建立Cookie物件
2.設定最大時效

3.將Cookie放入到HTTP響應報頭   

      如果你建立了一個cookie,並將他傳送到瀏覽器,預設情況下它是一個會話級別的cookie:儲存在瀏覽器的記憶體中,使用者退出瀏覽器之後被刪除。如果你希望瀏覽器將該cookie儲存在磁碟上,則需要使用maxAge,並給出一個以秒為單位的時間。將最大時效設為0則是命令瀏覽器刪除該cookie。

      cookie的傳送是通過擴充套件HTTP協議來實現的,需要使用HttpServletResponse的addCookie方法,將cookie插入到一個 Set-Cookie HTTP請求報頭中。由於這個方法並不修改任何之前指定的Set-Cookie報頭,而是建立新的報頭,因此我們將這個方法稱為是addCookie。同樣要記住響應報頭必須在任何文件內容傳送到客戶端之前設定。而cookie的使用是由瀏覽器按照一定的原則在後臺自動傳送給伺服器的。瀏覽器檢查所有儲存的cookie,如果某個cookie所宣告的作用範圍大於等於將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上傳送給伺服器。

四、cookie的讀取
1.要獲取有瀏覽器傳送來的cookie,需要呼叫HttpServletRequest的getCookies方法,這個呼叫返回Cookie物件的陣列,對應由HTTP請求中Cookie報頭輸入的值。
2.對陣列進行迴圈,呼叫每個cookie的getName方法,直到找到感興趣的cookie為止.cookie與你的主機(域)相關,而非你的servlet或JSP頁面。因而,儘管你的servlet可能只傳送了單個cookie,你也可能會得到許多不相關的cookie。

例如: 

	  String cookieName = “userID”;
		Cookie cookies[] = request.getCookies();
		if (cookies!=null){
			for(int i=0;i<cookies.length;i++){
			 Cookie cookie = cookies[i];
			 if (cookieName.equals(cookie.getName())){
			 doSomethingWith(cookie.getValue());
			}
		  }
		}



五、session的機制(中文含義為會話,是指有始有終的一系列動作/訊息)
  session機制是一種伺服器端的機制。我們可以這樣理解:當與服務端進行會話時,比如說登陸成功後,服務端會為使用者開闢一塊記憶體區間,用以存放使用者這次會話的一些內容,比如說使用者名稱之類的資訊。那麼就需要一個標識來標記這個記憶體區間是你的而不是別人的,這個標識就是session id(session id的值應該是一個既不會重複,又不容易被找到規律以仿造的字串),而這個記憶體區間你可以理解為session。伺服器會將這個session id發回給你的瀏覽器,放入你的瀏覽器的cookies中(session cookie 並且這個cookie是存放在記憶體中,它會隨著瀏覽器的關閉而消失)。只有你瀏覽器沒有關閉,你每向伺服器發請求,伺服器就會從你傳送過來的cookies中拿出這個session id,然後根據這個session id到相應的記憶體中取你之前存放的資料。如果你退出登陸了,伺服器會清掉屬於你的記憶體區域,所以你再登的話,就會產生一個新的session了。
       也就是,當程式需要為某個客戶端的請求建立一個session的時候,伺服器首先檢查這個客戶端的請求裡是否包含了session標識:session id,如果已經包含一個session id則說明以前已經為此客戶建立過session,伺服器就按照session id把這個session檢索出來使用。如果客戶請求不包含session id,則為此客戶建立一個session並且生成一個與此session相關聯的session id,這個session id將在本次響應中返回給客戶端儲存。

六、儲存session id的幾種方式
A.儲存session id的方式可以採用cookie,這樣在互動過程中瀏覽器可以自動的按照規則把這個標識傳送給伺服器。

B.由於cookie可以被人為的禁止,必須有其它的機制以便在cookie被禁止時仍然能夠把session id傳遞迴伺服器,經常採用的一種技術叫做URL重寫,就是把session id附加在URL路徑的後面,附加的方式也有兩種,一種是作為URL路徑的附加資訊,另一種是作為查詢字串附加在URL後面。網路在整個互動過程中始終保持狀態,就必須在每個客戶端可能請求的路徑後面都包含這個session id。

七、session什麼時候被建立

  一個常見的錯誤是以為session在有客戶端訪問時就被建立,然而事實是直到某server端程式(如Servlet)呼叫HttpServletRequest.getSession(true)這樣的語句時才會被建立。

八、session何時被刪除
A.程式呼叫HttpSession.invalidate()
B.距離上一次收到客戶端傳送的session id時間間隔超過了session的最大有效時間
C.伺服器程式被停止

  注意:關閉瀏覽器只會使儲存在客戶端瀏覽器記憶體中的session cookie失效,不會使伺服器端的session物件失效。

九、session與cookie的區別與聯絡

      session cookie針對某一次會話而言,會話結束session cookie也就隨著消失了,而persistent cookie是存在於客戶端硬碟上的一段文字(通常是加密的),不如session cookie安全性高,因此建議使用儲存在伺服器端的session機制更安全些。通常session cookie是不能跨視窗使用的,當你新開了一個瀏覽器視窗進入相同頁面時,系統會賦予你一個新的sessionid,這樣我們資訊共享的目的就達不到了,此時我們可以先把sessionid儲存在persistent cookie中,然後在新視窗中讀出來,就可以得到上一個視窗SessionID了,這樣通過session cookie和persistent cookie的結合我們就實現了跨視窗的session tracking(會話跟蹤)。

      session是以cookie或URL重寫為基礎,預設使用cookie來實現。系統會創造一個名為JSESSIONID的輸出cookie,我們叫做session cookie,以區別我們通常所說的cookie(persistent cookie),注意session cookie是儲存於瀏覽器記憶體中的,並不是寫到硬碟上的,jsessionid是伺服器那邊生成的,由伺服器那邊傳送到客戶端的資訊。我們通常情是看不到JSESSIONID的,但是當我們把瀏覽器的cookie禁止後,伺服器那邊得不到jsessionid,這樣也就沒法根據jsessionid獲得對應的session了。web伺服器會採用URL重寫的方式傳遞Sessionid,我們就可以在位址列看到 sessionid=KWJHUG6JJM65HS2K6之類的字串。

     

相關文章