使用者開啟瀏覽器,點選多個超連結,存取伺服器的多個web資源,然後關閉瀏覽器,整個過程就稱為一個對談;
HTTP 是無狀態的:在同一個連線中,兩個執行成功的請求之間是沒有關係的。這就帶來了一個問題,使用者沒有辦法在同一個網站中進行連續的互動
,比如在一個電商網站裡,使用者把某個商品加入到購物車,切換一個頁面後再次新增了商品,這兩次新增商品的請求之間沒有關聯,瀏覽器無法知道使用者最終選擇了哪些商品。而使用 HTTP 的頭部擴充套件,HTTP Cookies 就可以解決這個問題。把 Cookies 新增到頭部中,建立一個對談讓每次請求都能共用相同的上下文資訊,達成相同的狀態。
簡單來說:是伺服器傳送到瀏覽器,並儲存在瀏覽器端的一小塊資料。
當用戶使用瀏覽器再去存取伺服器中的 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!!!";
}
}
啟動專案,瀏覽器存取
屬性項 | 屬性項介紹 |
---|---|
NAME=VALUE | 鍵值對,可以設定要儲存的 Key/Value,注意這裡的 NAME 不能和其他屬性項的名字一樣 |
Path | 當存取哪個路徑時,攜帶此token |
Expires | 過期時間,在設定的某個時間點後該 Cookie 就會失效 |
Domain | 生成該 Cookie 的域名,如 domain="www.baidu.com" |
Secure | 如果設定了這個屬性,那麼只會在 SSH 連線時才會回傳該 Cookie |
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