cookie和session的區別和聯繫

cookie和session

session原理:

session是保存在服務器端,理論上是沒有是沒有限制,只要你的內存夠大

瀏覽器第一次訪問服務器時會創建一個session對象並返回一個JSESSIONID=ID的值,創建一個Cookie對象key為JSSIONID,value為ID的值,將這個Cookie寫回瀏覽器。

瀏覽器在第二次訪問服務器的時候攜帶Cookie信息JSESSIONID=ID的值,如果該JSESSIONID的session已經銷燬,那麼會重新創建一個新的session再返回一個新的JSESSIONID通過Cookie返回到瀏覽器

針對一個web項目,一個瀏覽器是共享一個session,如果有兩個web項目部署在同一個服務器上,針對兩個項目的session是不同的。如:你在tomcat上同時部署了兩個web項目,分別是web1、web2。當你在一個瀏覽器上同時訪問web1時創建的session是A1,訪問web2時創建的session是A2。後面你再多次訪問web1使用的session還是A1,多次訪問web2時使用session就是A2。

session是基於cookie技術實現,重啟瀏覽器後再次訪問原有的連接依然會創建一個新的session。因為Cookie在關閉瀏覽器後就會消失,但是原來服務器的Session還在,只有等到了銷燬的時間會自動銷燬

如果瀏覽器端禁用了Cookie,那麼每次訪問都會創建一個新的Session,但是我們可以通過服務器端程序重寫URL即可,如果頁面多連接多,會增加不必要的工作量,

HttpSession

由於 HTTP 協議是無狀態的協議,所以服務端需要記錄用戶的狀態時,就需要用某種機制來識具體的用戶,這個機制就是 Session。典型的場景比如購物車,當你點擊下單按鈕時,由於 HTTP 協議無狀態,所以並不知道是哪個用戶操作的,所以服務端要為特定的用戶創建了特定的 Session,用用於標識這個用戶,並且跟蹤用戶,這樣才知道購物車裡面有幾本書。這個 Session 是保存在服務端的,有一個唯一標識。在服務端保存 Session 的方法很多,內存、數據庫、文件都有。集群的時候也要考慮 Session 的轉移,在大型的網站,一般會有專門的Session服務器集群,用來保存用戶會話,這個時候 Session 信息都是放在內存的,使用一些緩存服務比如 Memcached 之類的來放 Session。

HttpSession 創建於服務器端,保存於服務器,維護於服務器端,而且每創建一個新的Session,服務器端都會分配一個唯一的ID,並且把這個ID保存到客戶端的Cookie中,保存形式是以JSESSIONID作為key來保存的。

通過HttpServletRequest.getSession() 進行獲得HttpSession對象,通過setAttribute()給會話賦值,可以通過invalidate()將其失效。

每一個HttpSession有一個唯一的標識SessionID,只要同一次打開的瀏覽器通過request獲取到session都是同一個。

WEB容器默認的是用Cookie機制保存SessionID到客戶端,並將此Cookie設置為關閉瀏覽器失效,Cookie名稱為:JSESSIONID

每次請求通過讀取Cookie中的SessionID獲取相對應的Session會話

HttpSession的數據保存在服務器端,所以不要保存數據量耗資源很大的數據資源,必要時可以將屬性移除或者設置為失效

HttpSession可以通過setMaxInactiveInterval()設置失效時間(秒)或者在web.xml中配置

HttpSession默認使用Cookie進行保存SessionID(key為JSESSIONID,value為SessionID),當客戶端禁用了Cookie之後,可以通過URL重寫的方式進行實現。

可以通過response.encodeURL(url) 進行實現

API對encodeURL的操作為,當瀏覽器支持Cookie時,url不做任何處理;當瀏覽器不支持或者禁用掉Cookie的時候,將會重寫URL將SessionID拼接到訪問地址後,

Cookie

Cookie和Session都是會話技術,但Cookie是運行在客戶端。

Cookie有大小限制以及瀏覽器在存cookie的個數也有限制

Cookie有安全隱患,通過攔截或本地文件找得到你的cookie後可以進行攻擊。

Cookies也是屬於Session對象的一種。但有不同,Cookies不會佔服務器資源,是存在客服端內存或者一個cookie的文本文件中;而“Session”則會佔用服務器資源。所以,儘量不要使用Session,而使用Cookies。但是我們一般認為cookie是不可靠的,session是可靠地,但是目前很多著名的站點也都以來cookie。有時候為了解決禁用cookie後的頁面處理,通常採用url重寫技術,調用session中大量有用的方法從session中獲取數據後置入頁面。


分享到:


相關文章: