Go Web开发五:Cookie
2018-06-27 本文已影响36人
狂奔的胖蜗牛
1.什么是Cookie
一种存储在客户端的,体积较小的信息,用于本地计算机保存一些用户操作的历史信息(包括登录信息),并在用户再次访问该站点时浏览器通过HTTP协议将本地cookie内容发送给服务器,从而完成验证,或继续上一步操作。这些信息最初都是由服务器通过HTTP响应报文返回给客户端的。后续客户端继续发送HTTP请求时,cookie都会随着请求一起发送至服务器。
Cookie大体上可以划分为:会话cookie和持久cookie。其他类型的cookie都是持久cookie的变种。
2.Go中的Cookie
该结构体定义如下:
type Cookie struct {
Name string
Value string
Path string // optional
Domain string // optional
Expires time.Time // optional
RawExpires string // for reading cookies only
// MaxAge=0 means no 'Max-Age' attribute specified.
// MaxAge<0 means delete cookie now, equivalently 'Max-Age: 0'
// MaxAge>0 means Max-Age attribute present and given in seconds
MaxAge int
Secure bool
HttpOnly bool
Raw string
Unparsed []string // Raw text of unparsed attribute-value pairs
}
- 会话cookie
如果没有Expires字段的cookie,通常被称为会话cookie或者临时cookie,这种cookie在浏览器关闭的时候回自动被移除。 - 持久cookie
设置了Expires字段的cookie,被称为持久cookie,这种cookie会一直存在,直到指定的过期时间来临或者手动删除为止 - MaxAge字段
该字段和Expires字段一样,用于设置cookie的过期时间。Expires字段明确指明cookie的过期时间。MaxAge则指明cookie在被浏览器创建出来后能够存活多少秒。
之所以会有两种方式方式,是由于不同的浏览器支持的字段不同,但是几乎所有浏览器都支持Expires,部分老浏览器不支持MaxAge。
3.Go将cookie发送至浏览器
使用Cookie结构的String方法可以得到一个序列化的cookie。
package main
import "net/http"
func main() {
server := http.Server{
Addr: "localhost:8080",
}
http.HandleFunc("/cookie", cookie)
server.ListenAndServe()
}
func cookie(w http.ResponseWriter, r *http.Request) {
c1 := http.Cookie{
Name: "first",
Value: "Go Web 1",
HttpOnly: true,
}
c2 := http.Cookie{
Name: "second",
Value: "Go Web 2",
HttpOnly: true,
}
w.Header().Set("Set-Cookie", c1.String())
w.Header().Add("Set-Cookie", c2.String())
}
- Set方法添加第一个cookie,Add方法添加第二个cookie。
-
打开浏览器的网页检查器,可以看到cookie如下所示:
屏幕快照 2018-06-27 下午9.48.27.png
4.使用SetCookie设置cookie
可以使用net/http库中的SetCookie方法设置cookie。
package main
import "net/http"
func main() {
server := http.Server{
Addr: "localhost:8080",
}
http.HandleFunc("/cookie", cookie)
server.ListenAndServe()
}
func cookie(w http.ResponseWriter, r *http.Request) {
c1 := http.Cookie{
Name: "first",
Value: "Go Web 1",
HttpOnly: true,
}
c2 := http.Cookie{
Name: "second",
Value: "Go Web 2",
HttpOnly: true,
}
//w.Header().Set("Set-Cookie", c1.String())
//w.Header().Add("Set-Cookie", c2.String())
http.SetCookie(w, &c1)
http.SetCookie(w, &c2)
}
这种方法设置cookie应该吧Cookie结构体的指针传入。
5.从客户端请求中获取Cookie
package main
import (
"net/http"
"fmt"
)
func main() {
server := http.Server{
Addr: "localhost:8080",
}
http.HandleFunc("/cookie", cookie)
http.HandleFunc("/getCookie", getCookie)
server.ListenAndServe()
}
//获取cookie
func getCookie(w http.ResponseWriter, r *http.Request) {
h := r.Header["Cookie"]
fmt.Fprintln(w, h)
}
func cookie(w http.ResponseWriter, r *http.Request) {
c1 := http.Cookie{
Name: "first",
Value: "Go Web 1",
HttpOnly: true,
}
c2 := http.Cookie{
Name: "second",
Value: "Go Web 2",
HttpOnly: true,
}
//w.Header().Set("Set-Cookie", c1.String())
//w.Header().Add("Set-Cookie", c2.String())
http.SetCookie(w, &c1)
http.SetCookie(w, &c2)
}
用浏览器访问:localhost:8080/getCookie如下,

可以使用:r.Cookie("first")
获得指定的Cookie。
还可以使用:r.Cookies()
返回一个包含了所有Cookie的切片,结果同r.Header["Cookie"]
。
由于没有设置Cookie的过期时间,这是会话Cookie。如果我们关闭浏览器再次访问setCookie,则之前设置的Cookie都会消失。