HTTP 请求与响应之cookie的设置与获取

简介

通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

对于服务器而言,当响应一个请求的时候会通过头部设置一个Set-Cookie作为key,以cookie的名称=值的形式作为value来设置cookie 对于客户端而言,当发送一个请求的时候,会在头部设置以Cookie作为key,以分号;分隔的多个名称=值的形式, 将该路径下的cookie全部发送给服务器。

对于cookie而言,生命周期是其一个重要的属性,按照这个属性,可以将cookie大致分为两类:

在go的http包中cookie是一个结构体

type cookie struct {
    Name string  //名称
    Value string  //cookie值
    Path string  //作用域
    Domain string 
    Expires time.Time
    RawExpires string
    MaxAge int
    Secure bool
    HttpOnly bool
    SameSite SameSite
    Raw string
    Unparsed []string
}

对于其中的字段而言,其说明如下:

使用

设置cookie

func greet(w http.ResponseWriter, r *http.Request) {
	c := http.Cookie{Name: "hello", Value: "world"}
	http.SetCookie(w, &c)
	fmt.Fprintf(w, "set cookie success,cookie name:%s, value:%s", c.Name, c.Value)
}

使用http.Cookie创建一个实例,然后使用http.SetCookie方法将cookie写入到响应中

获取cookie

func getCookie(w http.ResponseWriter, r *http.Request) {

	c1, err := r.Cookie("hello")
	if err != nil {
		fmt.Fprintf(w, err.Error())
		return
	}
	fmt.Fprintf(w, "get cookie success,cookie name:%s, value:%s", c1.Name, c1.Value)
}

使用r.cookie可以直接通过cookie的名称获取对应的cookie结构实例,当然还可以通过使用r.Cookies方法,将全部的cookie解析到一个切片中

删除cookie

func delCookie(w http.ResponseWriter, r *http.Request) {

	c1, err := r.Cookie("hello")
	if err != nil {
		fmt.Fprintf(w, "get cookie fail")
	}
	c1.MaxAge = -1
	http.SetCookie(w, c1)
	fmt.Fprintf(w, "del cookie success,cookie name:%s, value:%s", c1.Name, c1.Value)
}

cookie不能直接删除,只能通过设置其过期时间Expires和MaxAge两个属性来使其过期。