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 是与主机名绑定的,不考虑端⼝。