Go語言Cookie的設定與讀取

2020-07-16 10:05:02
Web 開發中一個很重要的議題就是如何做好使用者整個瀏覽過程的控制,因為 HTTP 協定是無狀態的,所以使用者的每一次請求都是無狀態的,不知道在整個 Web 操作過程中哪些連線與該使用者有關。應該如何來解決這個問題呢?Web 裡面經典的解決方案是 Cookie 和 Session。

Cookie 機制是一種用戶端機制,把使用者資料儲存在用戶端,而 Session 機制是一種伺服器端的機制,伺服器使用一種類似於雜湊表的結構來儲存資訊,每一個網站訪客都會被分配給一個唯一的識別符號,即 sessionID。

sessionID 的存放形式無非兩種:要麼經過 URL 傳遞,要麼儲存在用戶端的 Cookie 裡。當然,也可以將 Session 儲存到資料庫裡,這樣會更安全,但效率方面會有所下降。本節主要介紹 Go語言使用 Cookie 的方法。

設定 Cookie

Go語言中通過 net/http 包中的 SetCookie 來設定 Cookie:

http.SetCookie(w ResponseWriter, cookie *Cookie)

w 表示需要寫入的 response,cookie 是一個 struct,讓我們來看看物件是怎樣的:
type Cookie str、uct {
    Name        string
    Value       string
    Path        string
    Domain      string
    Expires     time.Time
    RawExpires  string
    // MaxAge=0 意味著沒有指定 Max-Age 的值
    // MaxAge<0 意味著現在就刪除 Cookie,等價於 Max-Age=0
    // MaxAge>0 意味著 Max-Age 屬性存在並以秒為單位存在
    MaxAge      int
    Secure      bool
    HttpOnly    bool
    Raw         string
    Unparsed    []string // 未解析的 attribute-value 屬性位對
}
下面來看一個如何設定 Cookie 的例子:
expiration := time.Now()
expiration := expiration.AddDate(1, 0, 0)
cookie := http.Cookie{Name: "username", Value: "zuolan", Expires: expiration}
http.SetCookie(w, &Cookie)

讀取 Cookie

上面的例子演示了如何設定 Cookie 資料,這裡演示如何讀取 Cookie:
cookie, _ := r.Cookie("username")
fmt.Fprint(w, cookie)
還有另外一種讀取方式:
for _, cookie := range r.Cookies() {
    fmt.Fprint(w, cookie.Name)
}
可以看到通過 request 獲取 Cookie 非常方便。