优先用MaxAge(秒数)设置Cookie过期时间,它比Expires(GMT字符串)更可靠、不受客户端时间影响;两者不可共存,共存时MaxAge生效,旧版IE仅支持Expires;删除需设MaxAge=0并匹配原path/domain。

直接用 c.SetCookie() 写一个带过期时间的 Cookie 就行,但必须注意 Expires 和 MaxAge 别同时设、域名和路径要配对、不能手动调 http.SetCookie。
为什么 c.Cookie("vid") 总返回 http.ErrNoCookie?
常见原因是:Cookie 根本没成功写入,或写入时路径/域名不匹配导致浏览器没发回来。
- 检查是否在写入前已有输出(比如提前
c.String()或日志打印),Header 已发送会导致Set-Cookie失效 -
http.Cookie.Path默认是"/",但如果路由挂载在/api下且你设了Path: "/api",那根路径请求就带不来这个 Cookie -
Domain必须和当前请求 Host 完全一致或为其父域(如请求是app.example.com,可设Domain: "example.com";但设成"com"或"other.com"会被浏览器拒绝) - 开发环境用
localhost时,Domain字段必须留空,否则浏览器直接忽略
SetCookie() 的过期时间怎么设才真正持久?
只设 Expires 不够,浏览器可能按自身策略降级处理;推荐优先用 MaxAge,它更明确、不受客户端时间偏差影响。
- 错误写法:
cookie.Expires = time.Now().Add(30 * 24 * time.Hour)—— 如果用户本地时间快了 2 小时,这个 Cookie 可能刚写入就被认为已过期 - 正确写法:
cookie.MaxAge = 30 * 24 * 3600(单位秒),Expires留空即可 - 两者都设?浏览器可能忽略
Expires,也可能行为不一致(Chrome 和 Safari 处理逻辑不同) - Session Cookie(关浏览器即失效):直接不设
MaxAge且Expires为零值
如何生成并验证一个安全的访客 ID?
别用时间戳或自增 ID —— 易被预测、可伪造。用加密安全随机数,再做一次哈希防碰撞。
- 生成示例:
uid, _ := uuid.NewRandom()(用github.com/google/uuid)或rand.Read(buf)+hex.EncodeToString(buf) - 写入时加
HttpOnly: true(防 XSS 读取)、Secure: true(仅 HTTPS 传输,开发时本地可设false) - 读取后建议校验长度和格式(比如 UUID 是 36 位含连字符),避免后续逻辑把脏数据当合法 ID 处理
- 如果只是临时标识、不要求全局唯一,
crypto/rand.Read生成 16 字节再 hex 编码也够用
最常被忽略的一点:Cookie 名称大小写敏感,且同一域名下所有路径共享。写的时候叫 "visitor_id",读的时候写成 "Visitor_ID" 就永远拿不到。


















