Cookie 和Session都是用來跟蹤瀏覽器用戶身份的會話方式,但是兩者的應用場景不太一樣。Cookie一般用來保存用戶信息,Session主要作用是通過服務端記錄用戶的狀態。

一、工作原理

1、Cookie

(1)瀏覽器端第一次發送請求到服務器端(2)服務器端創建Cookie,該Cookie中包含用戶的信息,然後將該Cookie發送到瀏覽器端(3)瀏覽器端再次訪問服務器端時會攜帶服務器端創建的Cookie(4)服務器端通過Cookie中攜帶的數據區分不同的用戶

2、Session

(1)Session是基於Cookie實現的。瀏覽器端第一次發送請求到服務器端,服務器端創建一個Session,為瞭保證在一個會話的多次請求之間Session是同一個,同時會創建一個特殊的Cookie,其name為JSESSIONID的固定值,value為session對象的ID,然後再將該Cookie發送至瀏覽器端。(2)瀏覽器端發送第二次及以上的請求到服務器端,瀏覽器端訪問服務器端時就會攜帶該name為JSESSIONID的Cookie對象(3)服務器端根據name為JSESSIONID的Cookie的value,去查詢Session對象,從而區分不同用戶。

註:對於第三步(3)

  • 如果name為JSESSIONID的Cookie不存在,即發生瞭關閉或更換瀏覽器的情況,返回(1)中重新去創建Session與特殊的Cookie
  • name為JSESSIONID的Cookie存在,根據value中的SessionId去尋找session對象
  • value為SessionId不存在,返回(1)中重新去創建Session與特殊的Cookie
  • value為SessionId存在,返回session對象

二、相同點與不同點

1、相同點:Cookie和Session都是來完成一次內多次請求間的數據共享

2、不同點存儲方式:Cookie是將數據存儲在客戶端,Session將數據存儲在服務端安全:Cookie不安全,Session安全存儲時間:Cookie可以長期儲存,而Session默認儲存30分鐘數據大小:Cookie最大不超過3KB,而Session沒有大小限制對於服務器性能:Cookie不占用服務器資源,Session需占用服務器資源

解釋:關於Cookie的缺點,第一,因為Cookie這個數據是存在瀏覽器上、存在客戶端上的,因為客戶端是誰我們不知道,且客戶端系統的安全程度也遠遠不如服務器,存在客戶端的數據不是很安全,特別是比較隱私的,如密碼等。第二,Cookie在很多請求中會把數據發送給服務器,每次訪問服務器都發同樣的數據,就會增加數據量,會對性能產生一定的影響。為瞭解決這些問題,引用瞭Session

三、Cookie和Session的使用

1、Cookie的使用

(1)設置Cookie返回給客戶端

//cookie示例
@RequestMapping(path = "cookie/set", method = RequestMethod.GET)
@ResponseBody
public String setCookie(HttpServletResponse response) {
//創建cookie
Cookie cookie = new Cookie("code", CommunityUtil.generateUUID());
//設置cookie生效范圍
cookie.setPath("community/alpha");
//設置cookie的生存時間
cookie.setMaxAge(60*10);
//發送cookie
response.addCookie(cookie);

return "set cookie";
}