一文理解Cookie、Session
一文理解Cookie、Session
1、什麼是會話
用戶打開瀏覽器,點擊多個超鏈接,訪問伺服器的多個web資源,然後關閉瀏覽器,整個過程就稱為一個會話;
HTTP 是無狀態的:在同一個連接中,兩個執行成功的請求之間是沒有關係的。這就帶來了一個問題,用戶沒有辦法在同一個網站中進行連續的交互
,比如在一個電商網站里,用戶把某個商品加入到購物車,切換一個頁面後再次添加了商品,這兩次添加商品的請求之間沒有關聯,瀏覽器無法知道用戶最終選擇了哪些商品。而使用 HTTP 的頭部擴展,HTTP Cookies 就可以解決這個問題。把 Cookies 添加到頭部中,創建一個會話讓每次請求都能共享相同的上下文資訊,達成相同的狀態。
2、Cookie
簡單來說:是伺服器發送到瀏覽器,並保存在瀏覽器端的一小塊數據。
當用戶使用瀏覽器再去訪問伺服器中的 web 資源時,就會帶著各自的數據去。這樣, web 資源處理的就是用戶各自的數據了。
cookie工作流程
示例程式碼:
基於SpringBoot構建測試環境:
@RestController
@RequestMapping("/alpha")
@Slf4j
public class AlphaController {
/**
* cookie示例
*/
@RequestMapping("/cookie/set")
public String setCookie(HttpServletResponse response) {
// 創建實例
Cookie cookie = new Cookie("code", CommunityUtil.generateUUID());
// 過期時間
cookie.setMaxAge(60 * 10);
// cookie的生效範圍 也就是在訪問什麼資源的情況下需要攜帶此cookie
cookie.setPath("/community/alpha");
response.addCookie(cookie);
return "set cookie ok!!!";
}
/**
* 獲取cookie
*/
@GetMapping("/cookie/get")
public String getCookie(@CookieValue("code") String code) {
log.warn("【獲取cookie】 code = {} ", code);
return "get cookie ok!!!";
}
}
啟動項目,瀏覽器訪問
cookie屬性項:
屬性項 | 屬性項介紹 |
---|---|
NAME=VALUE | 鍵值對,可以設置要保存的 Key/Value,注意這裡的 NAME 不能和其他屬性項的名字一樣 |
Path | 當訪問哪個路徑時,攜帶此token |
Expires | 過期時間,在設置的某個時間點後該 Cookie 就會失效 |
Domain | 生成該 Cookie 的域名,如 domain=”www.baidu.com“ |
Secure | 如果設置了這個屬性,那麼只會在 SSH 連接時才會回傳該 Cookie |
3、Session
session,存儲在我們的服務端,下圖是session工作流程圖。
- 也就是說,伺服器只返回對應的sessionId給瀏覽器
示例程式碼:
基於SpringBoot構建測試環境
/**
* session示例
*/
@RequestMapping("/session/set")
public String setCookie(HttpSession session) {
session.setAttribute("code", "0000");
return "set cookie ok!!!";
}
/**
* 獲取session
*/
@GetMapping("/session/get")
public String getCookie(HttpSession session) {
log.warn("【獲取cookie】 code = {} ", session.getAttribute("code"));
return "get cookie ok!!!";
}
啟動項目,瀏覽器訪問
可以看到,伺服器只返回sessionID
4、兩者區別
- cookie數據存放在客戶的瀏覽器(客戶端)上,session數據放在伺服器上,但是服務端的session的實現對客戶端的cookie有依賴關係的;
- cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙,考慮到安全應當使用session;
- session會在一定時間內保存在伺服器上。當訪問增多,會比較佔用你伺服器的性能。考慮到減輕伺服器性能方面,應當使用COOKIE;
- 單個cookie在客戶端的限制是3K,就是說一個站點在客戶端存放的COOKIE不能超過3K;