美文网首页
Go Web开发五:Cookie

Go Web开发五:Cookie

作者: 狂奔的胖蜗牛 | 来源:发表于2018-06-27 22:11 被阅读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如下,


屏幕快照 2018-06-27 下午10.00.09.png屏幕快照 2018-06-27 下午10.00.09.png

可以使用:r.Cookie("first")获得指定的Cookie。
还可以使用:r.Cookies()返回一个包含了所有Cookie的切片,结果同r.Header["Cookie"]

由于没有设置Cookie的过期时间,这是会话Cookie。如果我们关闭浏览器再次访问setCookie,则之前设置的Cookie都会消失。

相关文章

网友评论

      本文标题:Go Web开发五:Cookie

      本文链接:https://www.haomeiwen.com/subject/ehgiyftx.html