无法在golang中获取cookie的过期时间

11

我正在设置一个新的cookie

func f1(w http.ResponseWriter, r *http.Request) {
...
expire := time.Now().AddDate(0, 1, 0)
cookie := http.Cookie{"token", token, "/", "domain", expire, expire.Format(time.UnixDate), 86400, true, true, "token=" + token, []string{"token=" + token}}
http.SetCookie(w, &cookie)

然后我试图获取它

func f2(w http.ResponseWriter, r *http.Request) {
...
cookie, err := r.Cookie("token")
fmt.Println(cookie.Value)
fmt.Println(cookie.Expires)

输出

valid_token_string
0001-01-01 00:00:00 +0000 UTC

数值是我设置的一样,但过期时间却为空。为什么?


2
只是顺便提一下:在设置Cookie时,Cookie的RawExpiresRawUnparsed字段不会被使用。 - user142162
3个回答

15
这就是HTTP工作的方式。expires属性只与Set-Cookie响应头一起发送,而不与Cookie请求头一起发送。Cookie请求头仅包含cookie的名称和值,而不包含任何其他元数据。

文档说明:SetCookie将一个Set-Cookie头添加到提供的ResponseWriter的头部。 http://golang.org/pkg/net/http/ - spe
1
@spre 我不明白那与此相关。您正在使用Cookie,它从请求中读取cookie信息。而SetCookie则是为响应设置cookie信息的。 - user1804599
我明白了。那么,在服务器端无法获取cookie过期时间,是吗? - spe
1
不,数据不可用,所以你无法获取它。 - user1804599

0

我花了一些时间来弄清楚如何使用过期时间。

我觉得这个答案还不够。 我想再加两点:

  1. 服务器端 cookie 可以设置额外的安全性(称为 http-only),使它们只对服务器可见,而不是客户端 javascript,但它们仍然由浏览器存储以表示特定的客户端。参考文献
  2. 当后端使用过期时间设置此 cookie 时,浏览器在过期后立即删除 cookie。

我相信这就是过期的工作方式。 如果我们存储一个会话令牌,后端将无论如何检查会话是否过期。


-2
如果您想查询过期时间,应将其视为不同的cookie进行处理。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接