深刻Cookie與Session的區別與原理

Cookie與Session區別:

  • 做用範圍不一樣,Cookie 保存在客戶端(瀏覽器),Session 保存在服務器端。
  • 有效期不一樣,Cookie 可設置爲長時間保持,好比咱們常常使用的默認登陸功能,Session 通常失效時間較短,客戶端關閉或者 Session 超時都會失效。
  • 隱私策略不一樣,Cookie 存儲在客戶端,比較容易遭到不法獲取,早期有人將用戶的登陸名和密碼存儲在 Cookie 中致使信息被竊取;Session 存儲在服務端,安全性相對 Cookie 要好一些。
  • 存儲大小不一樣, 單個 Cookie 保存的數據不能超過 4K,Session 可存儲數據遠高於 Cookie。
  • session不能區分路徑,同一個用戶在訪問一個網站期間,全部的session在任何一個地方均可以訪問到。Cookie有個setPath的方法,能夠設置可訪問的路徑,那麼同一個網站中不一樣路徑下的cookie互相是訪問不到的

什麼是 Cookie:

Cookie是服務器發送到客戶端並保存在本地的一小塊數據,它會在客戶端下次向同一服務器再發起請求時被攜帶併發送到服務器上。一般,它用於告知服務端兩個請求是否來自同一瀏覽器,如保持用戶的登陸狀態。Cookie 使基於無狀態的 HTTP 協議記錄穩定的狀態信息成爲了可能。cookie中的數據以{key:value}的形式存在。前端

cookie機制原理:

好比服務端要想記錄用戶的狀態,就使用response向瀏覽器發送一個Cookie。客戶端瀏覽器會將這個cookie保存起來。瀏覽器再次請求服務端時,瀏覽器會把這個cookie帶上。服務端檢查這個cookie來獲取用戶狀態。瀏覽器

Cookie經常使用屬性:

  • name cookie的名字,Cookie一旦建立,名稱便不可更改安全

  • value cookie的值bash

  • domain 能夠訪問該cookie的域名。若是設置爲「.baidu.com」,則全部以「baidu.com」結尾的域名均可以訪問該Cookie;第一個字符必須爲「.」服務器

  • maxAge Cookie失效的時間,單位秒。 正數,則超過maxAge秒以後失效。 負數,該Cookie爲臨時Cookie,關閉瀏覽器即失效,瀏覽器也不會以任何形式保存該Cookie。 爲0,表示刪除該Cookie。cookie

  • isHttpOnly HttpOnly屬性是用來限制非HTTP協議程序接口對客戶端Cookie進行訪問,將取Cookie的操做放到服務端,這樣能有效的防止XSS攻擊。session

建立Cookie:

Cookie cookie = new Cookie("cookieSessionId","qwertyuiop"); //構造函數
cookie.setDomain(".baidu.com");             // 設置域名
cookie.setPath("/");                        // 設置路徑
cookie.setMaxAge(Integer.MAX_VALUE);        // 設置有效期爲永久
response.addCookie(cookie);                 // 回寫到客戶端
複製代碼

Cookie更新與刪除:

Cookie自己並無提供修改和刪除的方法,通常經過使用相同name的Cookie來覆蓋原來的Cookie,以達到更新或刪除的目的。併發

Cookie cookie = new Cookie("cookieSessionId","new-qwertyuiop");
response.addCookie(cookie);

Cookie cookie = new Cookie("cookieSessionId","new-qwertyuiop");
cookie.setMaxAge(0);//設置一個當即失效的cookie覆蓋原cookie
response.addCookie(cookie);
複製代碼

如何獲取與發送cookie

//服務端從客戶端取得cookie
Cookie[] cookies = request.getCookies();

//服務端向客戶端發送cookie
response.addCookie(cookie);   
複製代碼

對於Cookie來講,Cookie的同源只關注域名,是忽略協議和端口的。因此通常狀況下,https://localhost:80和http://localhost:8080的Cookie是共享的。單個 Cookie 保存的數據不能超過 4K。dom

cookie的優缺點:

  • 優勢: 適合用於存放須要每一個請求都必須攜帶的數據 服務端也能夠直接操做 Cookie 能夠經過 domain 以及 path 控制數據存儲的範圍
  • 缺點: 容量有限,規範只要求每一個域名下最低提供 4kb 的存儲空間 每次請求都會攜帶,若是存放了大量沒必要要的數據很顯然會影響頁面性能 不安全,永遠不要在 Cookie 中存放用戶的敏感數據 前端 API 不友好,CRUD 都是經過 document.cookie 進行,沒有提供相關操做的方法

Session

Session 表明着服務器和客戶端一次會話的過程。Session 對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session 對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當客戶端關閉會話,或者 Session 超時失效時會話結束。函數

session機制原理:

當客戶端請求建立一個session時,服務端會先檢查客戶端的請求裏面有沒有帶着session標識-sessionId。若是有,則說明服務器之前已爲此客戶端建立過session,因而就根據這個sessionId把session檢索出來。若是客戶端請求中不包含sessionId,則爲客戶端建立一個session而且生成一個與這個session相關聯的sessionId。 這個sessionId將被在本次響應中返回給客戶端保存。保存sessionId的方式大多狀況下用的是cookie。

建立session

HttpSession session = request.getSession();

一隻努力加載進度條的小前端,若是有錯誤,歡迎在評論中留言指正~

相關文章
相關標籤/搜索