Go处理Cookie

cookie 的出现是为了解决 HTTP 协议的⽆状态性的。客户端通过 HTTP 协议与服务器通信,多次请求之间⽆法记录状态。服务器可以在响应中设置 cookie,客户端保存这些 cookie。然后每次请求时都带上这些 cookie,服务器就可以通过这些 cookie 记录状态,辨别⽤户身份等。

package main

import (
	"fmt"
	"net/http"
)

// 设置cookie 示例:例如后端检查输入的用户密码 是否正确,正确的话,才下发cookie
func SetCookie(w http.ResponseWriter, r *http.Request) {
	c1 := &http.Cookie{
		Name:     "name",
		Value:    "lizhisheng",
		HttpOnly: true,
	}

	c2 := &http.Cookie{
		Name:     "name1",
		Value:    "zhoujielun",
		HttpOnly: true,
	}

	w.Header().Set("Set-Cookie", c1.String())
	// 便捷语法 会把上面覆盖掉
	//http.SetCookie(w, c1)

	w.Header().Add("Set-Cookie", c2.String())


	fmt.Fprint(w, "cookie给你了")
}

// 获取cookie 示例:有了cookie之后,才能进行某些操作,否则跳转到登录页面
func GetCookie(w http.ResponseWriter, r *http.Request) {
	// 指定获取哪一个cookie
	name, err := r.Cookie("name")
	if err != nil {
		fmt.Fprintln(w, "cannot get cookie of name")
	}

	// 获取全部cookie
	cookies := r.Cookies()
	fmt.Println(cookies)

	fmt.Fprintln(w, name)
	fmt.Fprintln(w, cookies)
	fmt.Fprintln(w, "取Cookie")

}

func main() {
	http.HandleFunc("/setcookie", SetCookie)
	http.HandleFunc("/getcookie", GetCookie)
	http.ListenAndServe(":8080", nil)
}

  • Name/Value :cookie 的键值对,都是字符串类型;
  • 没有设置 Expires 字段的 cookie 被称为会话 cookie 或临时 cookie,这种 cookie 在浏览器关闭时就会⾃动删除。设置了 Expires 字段的 cookie 称为持久 cookie,这种 cookie 会⼀直存在,直到指定的时间来临或⼿动删除;

Expires 和 MaxAge 都可以⽤于设置 cookie 的过期时间。 Expires 字段设置的是 cookie 在什么时间点过期,⽽ MaxAge 字段表示 cookie ⾃创建之后能够存活多少秒。虽然 HTTP 1.1 中废弃了Expires ,推荐使⽤ MaxAge 代替。但是⼏乎所有的浏览器都仍然⽀持 Expires ;⽽且,微软的IE6/IE7/IE8 都不⽀持 MaxAge 。所以为了更好的可移植性,可以只使⽤ Expires 或同时使⽤这两个字段。

  • HttpOnly 字段设置为 true 时,该 cookie 只能通过 HTTP 访问,不能使⽤其它⽅式操作,如
    JavaScript。提⾼安全性;
  • 有⼀点需要注意,cookie 是与主机名绑定的,不考虑端⼝。