Golang中Cookie属性设置失败的问题

Golang中Cookie属性设置失败的问题 以下是我使用内置的 net/http 包设置 Cookie 的代码。它能够正常发送 Cookie,但不会附带任何属性。我不明白为什么会这样。

// 将令牌作为 Cookie 提供给前端
ck := &http.Cookie{
	Name:  "token",
	Value: "test",
	Path:  "/",
	MaxAge:   int(time.Now().Add(time.Minute * 60).Unix()),
	HttpOnly: true,
	Secure:   true,
	SameSite: http.SameSiteLaxMode,
}
http.SetCookie(w, ck)

返回的响应头看起来像这样。

Set-Cookie: token=<valid token>

我期望的结果更接近这样:

Set-Cookie: token=<valid token>; Path=/; Max-Age=3600; HttpOnly; Secure; SameSite=Lax

更多关于Golang中Cookie属性设置失败的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中Cookie属性设置失败的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


问题出在 MaxAge 字段的设置上。你错误地将一个未来的时间戳赋值给了 MaxAge,而 MaxAge 应该是一个以秒为单位的相对时间值。这会导致 MaxAge 被忽略,进而可能影响其他属性的序列化。

以下是修正后的代码:

ck := &http.Cookie{
    Name:     "token",
    Value:    "test",
    Path:     "/",
    MaxAge:   60 * 60, // 3600 秒,即 1 小时
    HttpOnly: true,
    Secure:   true,
    SameSite: http.SameSiteLaxMode,
}
http.SetCookie(w, ck)

MaxAge 表示 Cookie 从设置时刻起存活的秒数。你原来的代码 int(time.Now().Add(time.Minute * 60).Unix()) 计算的是一个未来的绝对 Unix 时间戳(例如 1717751234),这个数值远大于 MaxAge 的合理范围,导致该属性无效。

正确的做法是直接设置相对秒数。例如,60 * 60 代表一小时。这样设置后,所有属性(PathMax-AgeHttpOnlySecureSameSite)都会正确出现在响应头中。

回到顶部