设置Cookie的最大使用期限;失去最大年龄

时间:2019-04-18 22:06:17

标签: go cookies

所以..我有这个单元测试:

func TestCookieVoodoo(t *testing.T) {
    req := httptest.NewRequest("GET", "/", nil)

    cookie := http.Cookie{Name: "potato", MaxAge: 1000}

    req.AddCookie(&cookie)

    cookieCopy, _ := req.Cookie("potato")

    println(fmt.Sprintf("Cookie orig: %v", cookie))
    println(fmt.Sprintf("Cookie Copy: %v", *cookieCopy))

    t.Fail()
}

运行时,输出为:

Cookie orig: {potato    0001-01-01 00:00:00 +0000 UTC  1000 false false 0  []}
Cookie copy: {potato    0001-01-01 00:00:00 +0000 UTC  0 false false 0  []}

为什么会失去最大年龄? (设置其他Cookie字段时也会发生同样的情况)

3 个答案:

答案 0 :(得分:6)

因为key仅将valuefunc (r *Request) AddCookie(c *Cookie) { s := fmt.Sprintf("%s=%s", sanitizeCookieName(c.Name), sanitizeCookieValue(c.Value)) if c := r.Header.Get("Cookie"); c != "" { r.Header.Set("Cookie", c+"; "+s) } else { r.Header.Set("Cookie", s) } } 添加到cookie字符串中。功能是:

cookie-string

为什么?

  1. 这是RFC 6265Max-Age的定义
  2. cookie的key=value和其他字段由客户端而非服务器使用。他们是客户端的配置。例如:如果cookie到期,则客户端不会将ecosystem.config.js发送到服务器。因此,请求
  3. 中的字段将被忽略

答案 1 :(得分:3)

如果您查看AddCookie代码,您会发现它以Cookie的形式将<Name>=<Value>标头附加到请求,或附加到现有的Cookie标头而忽略Cookie结构的所有其他字段(名称和值除外)。

Cookie标头仅包含NameValue的概念,有关Cookie标头的更多信息可以在here中找到。

另一方面,Set-Cookie标头将保留Cookie结构的所有字段,但这通常会在HTTP响应上进行设置。因此,将其设置在您的http.Request上并没有任何意义。

答案 2 :(得分:1)

AddCookie的Go实现中,它仅使用NameValue字段。

我认为这是因为MaxAgeResponse中发送cookie时有效,而在制作Request时则无关紧要。客户收到的随请求一起提交的任何Cookie(与您的情况相同)都应经过验证;然后,有效的Cookie会与AddCookie添加在一起,并且只有它们的键和值会与请求一起提交。