computer-network
  • 简介
  • 应用层
    • HTTP
      • Cookie
      • Session
    • HTTPS
      • 简介
      • 原理
      • RSA加密与解密
      • 证书签名与验证
      • TLS双向认证
  • 传输层
    • TCP
      • CloseWait
      • tcp_tw_recycle与tcp_timestamps
  • 网络层
    • IPv6
  • 链路层
    • VLAN
Powered by GitBook
On this page
  • HTTP协议
  • Go语言Cookie结构体
  • 示例
  • 参考

Was this helpful?

  1. 应用层
  2. HTTP

Cookie

HTTP协议

在http协议的请求头(Request Header)(参考1)中,有一个Cookie字段。可以在http请求中加入相应的cookie信息。

在http协议的响应头(Response Header)中,有一个Set-Cookie字段,通过该字段客户端可以保存服务端返回的cookie信息,以便在下次请求的时候携带上cookie

Go语言Cookie结构体

在go语言中的net/http包中,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
}

解释一下上面的MaxAge字段,MaxAge字段为一个整型:

  • 当大于0时,表示该cookie可以被保存多长时间(以秒为单位),此时浏览器一般会把它保存在本地文件中,浏览器退出后重新登录,此cookie依旧可用;

  • 当MaxAge为0时,该cookie会被浏览器保存在内存中,浏览器没有退出的话,一直可以使用该cookie,但退出后就会不能被使用;

  • 当MaxAge小于0时,表示服务器告诉浏览器立即删除该cookie。

示例

下面以一个go程序(参考2)来模拟cookie:

  • 当访问/readcookie路径时,服务器在http协议的response body中返回浏览器携带的cookie信息;如果浏览器未携带cookie,则返回提示信息

  • 当访问/writecookie路径时,服务器在http的response header中的Set-Cookie字段返回一个cookie,该cookie在浏览器再次访问/readcookie路径时将被使用

  • 当访问/deletecookie路径时,服务器将cookie的MaxAge字段设为-1,告诉浏览器立即删除该cookie

服务器代码如下:

package main

import (
    "net/http"
)

func SayHello(w http.ResponseWriter, req *http.Request) {
    w.Write([]byte("Hello"))
}

func ReadCookieServer(w http.ResponseWriter, req *http.Request) {
    // read cookie
    cookie, err := req.Cookie("testcookiename")
    if err == nil {
        cookievalue := cookie.Value
        w.Write([]byte("<b>cookie的值是:" + cookievalue + "</b>\n"))
    } else {
        w.Write([]byte("<b>读取出现错误:" + err.Error() + "</b>\n"))
    }
}

func WriteCookieServer(w http.ResponseWriter, req *http.Request) {
    cookie := http.Cookie{Name: "testcookiename", Value: "testcookievalue", Path: "/", MaxAge: 86400}
    http.SetCookie(w, &cookie)

    w.Write([]byte("<b>设置cookie成功。</b>\n"))
}

func DeleteCookieServer(w http.ResponseWriter, req *http.Request) {
    cookie := http.Cookie{Name: "testcookiename", Path: "/", MaxAge: -1}
    http.SetCookie(w, &cookie)

    w.Write([]byte("<b>删除cookie成功。</b>\n"))
}

func main() {
    http.HandleFunc("/", SayHello)
    http.HandleFunc("/readcookie", ReadCookieServer)
    http.HandleFunc("/writecookie", WriteCookieServer)
    http.HandleFunc("/deletecookie", DeleteCookieServer)

    http.ListenAndServe(":8082", nil)
}

接下来我们第一次访问 x.x.x.x:8082/readcookie,如下没有任何cookie信息

然后我们访问x.x.x.x:8082/writecookie

然后,我们再访问x.x.x.x:8082/readcookie,此时我们发现这一次浏览器携带保存的cookie

我们可以查看当前请求所携带的cookie信息(右击firefox的导航栏 --》 菜单栏 --》 工具 --》 页面信息 --》 安全 --》 cookie)

关闭浏览器,再次访问x.x.x.x:8082/readcookie,还是能看到cookie信息,说明浏览器把它保存在本地文件中了

接下来,我们访问x.x.x.x:8082/deletecookie

然后,再访问x.x.x.x:8082/readcookie,发现cookie已经被浏览器删掉了,所以本次请求没有cookie信息

参考

PreviousHTTPNextSession

Last updated 5 years ago

Was this helpful?

(1)

(2)

https://zh.wikipedia.org/wiki/HTTP%E5%A4%B4%E5%AD%97%E6%AE%B5
https://studygolang.com/articles/5905