HTTP Cookies知識-檢視、發送、擷取、傳回
我最新最全的文章都在 南瓜慢說 www.pkslow.com ,歡迎大家來喝茶!
1 簡介
HTTP Cookies
是伺服器發送到使用者浏覽器并儲存在本地的一小塊資料,它會在浏覽器下次向同一伺服器再發起請求裡被攜帶并發送到伺服器上。
Cookie 主要用于以下三個方面:
- 會話狀态管理(如使用者登入狀态、購物車、遊戲分數或其它需要記錄的資訊)
- 個性化設定(如使用者自定義設定、主題等)
- 浏覽器行為跟蹤(如跟蹤分析使用者行為等)
2 Chrome檢視Cookies
通過
Chrome
強大的工具,可以直接檢視
Cookies
,如下面所示:

3 Cookies的屬性
3.1 限制通路Cookie
3.1.1 Secure标記
标記為
Secure
的
Cookie
隻能被
HTTPS
協定加密過的請求發送給服務端,使用
HTTP
是不行的,但
localhost
除外。
3.1.2 HttpOnly标記
标記為
HttpOnly
的
Cookie
隻能通過
HTTP
傳輸,而無法在用戶端本地通過
JavaScript
通路。這有助于緩解
跨站點腳本(XSS)
攻擊。
3.2 Cookie的作用域
3.2.1 Domain屬性
用于指定哪些主機可以接受
Cookie
,如果不指定,預設為
Origin
,不包含子域名。如果指定了
Domain
,則一般包含子域名。是以,指定Doain,限制其實更少。
比如,如果
Domain=pkslow.com
,那
blog.pkslow.com
也可以接受。
3.2.2 Path屬性
指定哪些路徑可以接受
Cookie
,子路徑也會比對。
比如,如果
Path=/post
,那以下都可以比對:
- /post
- /post/1
- /post/1/update
4 Springboot操作Cookies
4.1 擷取
4.1.1 通過注解@CookieValue
@RequestMapping("/hello")
public String hello(@CookieValue("foo") String fooCookie) {
// ...
}
4.1.2 通過工具類WebUtils的getCookie方法
public static Cookie getCookie(HttpServletRequest request, String name) {
Assert.notNull(request, "Request must not be null");
Cookie[] cookies = request.getCookies();
if (cookies != null) {
Cookie[] var3 = cookies;
int var4 = cookies.length;
for(int var5 = 0; var5 < var4; ++var5) {
Cookie cookie = var3[var5];
if (name.equals(cookie.getName())) {
return cookie;
}
}
}
return null;
}
4.1.3 WebFlux的ServerWebExchange擷取
HttpCookie value = exchange.getRequest().getCookies().getFirst("foo");
4.2 傳回
與擷取反着來就行了,擷取是從
Request
中拿資料;發送就是把資料放到
Response
中去。
response.addCookie();
5 發送Cookie
5.1 浏覽器
浏覽器會根據規則發送,這個不用開發人員自己處理。
5.2 Postman
Postman
可以在這裡設定:
5.3 curl指令
curl -v --cookie "key1:value1;key2:value2;" http://localhost:8080/
5.4 JavaScript fetch方法
credentials
是
Request
接口的隻讀屬性,用于表示使用者代理是否應該在跨域請求的情況下從其他域發送cookies。這與XHR的withCredentials 标志相似,不同的是有三個可選值(後者是兩個):
-
: 從不發送cookies.omit
-
: 隻有當URL與響應腳本同源才發送 cookies、 HTTP Basic authentication 等驗證資訊.(浏覽器預設值,在舊版本浏覽器,例如safari 11依舊是omit,safari 12已更改)same-origin
-
: 不論是不是跨域的請求,總是發送請求資源域在本地的 cookies、 HTTP Basic authentication 等驗證資訊.include
為了讓浏覽器發送包含憑據的請求(即使是跨域源),要将
credentials: 'include'
添加到傳遞給
fetch()
方法的
init
對象。
fetch('https://example.com', {
credentials: 'include'
})
如果你隻想在請求URL與調用腳本位于同一起源處時發送憑據,請添加
credentials: 'same-origin'
。
// The calling script is on the origin 'https://example.com'
fetch('https://example.com', {
credentials: 'same-origin'
})
要改為確定浏覽器不在請求中包含憑據,請使用
credentials: 'omit'
。
fetch('https://example.com', {
credentials: 'omit'
})
6 總結
開發中遇到了一些
Cookies
問題,整理了一下相關的知識點。
歡迎關注微信公衆号<南瓜慢說>,将持續為你更新...
多讀書,多分享;多寫作,多整理。