天天看點

HTTP Cookies知識-檢視、發送、擷取、傳回

HTTP Cookies知識-檢視、發送、擷取、傳回

我最新最全的文章都在 南瓜慢說 www.pkslow.com ,歡迎大家來喝茶!

1 簡介

HTTP Cookies

是伺服器發送到使用者浏覽器并儲存在本地的一小塊資料,它會在浏覽器下次向同一伺服器再發起請求裡被攜帶并發送到伺服器上。

Cookie 主要用于以下三個方面:

  • 會話狀态管理(如使用者登入狀态、購物車、遊戲分數或其它需要記錄的資訊)
  • 個性化設定(如使用者自定義設定、主題等)
  • 浏覽器行為跟蹤(如跟蹤分析使用者行為等)

2 Chrome檢視Cookies

通過

Chrome

強大的工具,可以直接檢視

Cookies

,如下面所示:

HTTP 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

可以在這裡設定:

HTTP Cookies知識-檢視、發送、擷取、傳回

5.3 curl指令

curl -v --cookie "key1:value1;key2:value2;" http://localhost:8080/
           

5.4 JavaScript fetch方法

credentials

Request

接口的隻讀屬性,用于表示使用者代理是否應該在跨域請求的情況下從其他域發送cookies。這與XHR的withCredentials 标志相似,不同的是有三個可選值(後者是兩個):

  • omit

    : 從不發送cookies.
  • same-origin

    : 隻有當URL與響應腳本同源才發送 cookies、 HTTP Basic authentication 等驗證資訊.(浏覽器預設值,在舊版本浏覽器,例如safari 11依舊是omit,safari 12已更改)
  • include

    : 不論是不是跨域的請求,總是發送請求資源域在本地的 cookies、 HTTP Basic authentication 等驗證資訊.

為了讓浏覽器發送包含憑據的請求(即使是跨域源),要将

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

問題,整理了一下相關的知識點。

歡迎關注微信公衆号<南瓜慢說>,将持續為你更新...

多讀書,多分享;多寫作,多整理。