[Go] Cookie 使用简介
Golang 的 Cookie
web 開發免不了要和 cookie 打交道。Go 的 http 庫也提供了 cookie 的相關操作。
type Cookie struct {Name stringValue stringPath stringDomain stringExpires time.TimeRawExpires stringMaxAge intSecure boolHttpOnly boolRaw stringUnparsed []string }Name 字段為 cookie 的名字,Value 是其值,剩下的 Path 和 Domain 則是 cookie 的存儲的范圍。Expires 是 cookie 的過期時間,如果不設置,那么這是一個 session 型的 cookie,即瀏覽器會話有用,一旦關閉瀏覽器,cookie 隨即會被刪除。
設置 Cookie
cookie 是 header 一項內容,因此可以使用 reponse 的 Header 方法設置 cookie。
func setCookieHandler(w http.ResponseWriter, r *http.Request) {c1 := http.Cookie{Name: "first_cookie",Value: "vanyar",HttpOnly: true,}c2 := http.Cookie{Name: "second_cookie",Value: "noldor",HttpOnly:true,}w.Header().Set("Set-Cookie", c1.String())w.Header().Add("Set-Cookie", c2.String()) }cookie.png
這里也可以測試驗證 Set 和 Add 兩個方法的差別。當然,和文件上傳類似,Go 也提供了常用的工具函數。
http.SetCookie(w, &c1) http.SetCookie(w, &c2)http 的 SetCookie 方法也可以設置 cookie,就不需要關系 Set 和 Add 的先后順序了,當然第二個參數是一個 Cookie 的指針對象。設置了 cookie,接下來就是需要讀 cookie。
讀取 Cookie
讀取 cookie 的方式也有很多,cookie 封裝在header中,當然可以通過 header 方法處理。
func getCookieHandler(w http.ResponseWriter, r *http.Request) {h := r.Header["Cookie"]fmt.Fprintln(w, h) }不使用 Header 方法,也可以使用 Request 的方法:
func getCookieHandler(w http.ResponseWriter, r *http.Request) {c1, err := r.Cookie("first_cookie")if err != nil{fmt.Fprintln(w, "Cannot get cookie")}cs := r.Cookies()fmt.Fprintln(w, c1)fmt.Fprintln(w, cs) }訪問的時候可以發現,r.Cookie 返回了對于 key 的鍵值對,而 r.Cookies 則返回了所有 cookie 的 key 的鍵值對值。
Cookie 與 消息
cookie 的作用很多,通常記錄客戶端的一些信息,用來做用戶的登錄驗證。現在我們需要使用 cookie 來做一個小特性---消息。通常 web 請求發出后,response 返回數據,也可以設置一些消息用來指引用戶。
func setMessageHandler(w http.ResponseWriter, r *http.Request) {msg := []byte("Hello World")c := http.Cookie{Name: "flash",Value:base64.URLEncoding.EncodeToString(msg),}http.SetCookie(w, &c) }func getMessageHandler(w http.ResponseWriter, r *http.Request) {c, err := r.Cookie("flash")if err != nil {if err == http.ErrNoCookie {fmt.Fprintln(w, "No message found")}} else {rc := http.Cookie{Name: "flash",MaxAge: -1,Expires:time.Unix(1, 0),}http.SetCookie(w, &rc)val, _ := base64.URLEncoding.DecodeString(c.Value)fmt.Fprintln(w, string(val))} }setMessageHandler 函數很簡單,就是創建一個 cookie 實例,然后把消息寫入到 cookie,然后再返回給客戶端。
getMessageHandler 首先會讀取 key 為 flash 的 cookie,如果沒讀到內容,則表示消息不存在,否則就創建另外一個 cookie,設置其過期時間這里等于清除 cookie。然后把讀取出來的 message 返回給客戶端。完成消息通信。
總結
我們討論了 Go 中 cookie 的基本應用。現在的 web 開發中,人們越來越重視網絡安全,因此 cookie 的安全也成為用戶關心的內容。Go 原生的 cookie 封裝比較簡單。Go 的社區卻開發了很多輪子,實現了secure cookie,例如 gorilla/securecookie 庫。實際開發中,可能會借助一些三方的庫或包來完成功能。
總結
以上是生活随笔為你收集整理的[Go] Cookie 使用简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 交互神器 Facebook Origam
- 下一篇: 控制iOS的导航栏和状态栏的样式