2026-10-19 12:44:32
HTTP Cookie是Web开发中实现状态管理的核心机制,Go语言通过net/http包提供了简洁高效的Cookie操作接口。本教程将详细介绍如何在Go中正确设置和管理Cookie,包括核心方法、结构体解析及完整示例。
Go语言中设置Cookie的正确方式是通过http.SetCookie函数,其签名如下:
func SetCookie(w ResponseWriter, cookie *Cookie)w:HTTP响应写入器(http.ResponseWriter)
cookie:指向http.Cookie结构体的指针
错误方式:使用req.AddCookie(&cookie)
func handler(w http.ResponseWriter, req *http.Request) { cookie := &http.Cookie{Name: "test", Value: "123"} req.AddCookie(cookie) // 错误!仅用于模拟客户端请求}问题:req.AddCookie仅用于向当前请求添加Cookie(如测试场景),不会将Cookie发送到客户端。
结构体初始化错误:
http.Cookie{"test", "tcookie", ...} // 编译错误!原因:http.Cookie结构体包含多个字段,未命名字段初始化需严格按定义顺序排列,且部分字段(如RawExpires)不应直接设置。
http.Cookie定义了Cookie的所有属性,关键字段如下:
type Cookie struct { Name string // Cookie名称(必填) Value string // Cookie值(必填) Path string // 作用路径,默认为"/" Domain string // 作用域名,默认为当前域名 Expires time.Time // 过期时间(UTC),与MaxAge互斥 MaxAge int // 存活时间(秒),0=立即删除,-1=会话Cookie Secure bool // 仅HTTPS传输 HttpOnly bool // 禁止JS访问 SameSite SameSite // 跨站请求策略(Lax/Strict/None)}关键字段说明Expires:绝对过期时间(如time.Now().Add(24 * time.Hour))。
MaxAge:相对存活时间(秒),优先于Expires。
SameSiteLax:默认值,允许同站请求和部分跨站请求(如链接跳转)。
SameSiteStrict:仅允许同站请求。
SameSiteNone:允许跨站请求,但必须与Secure: true共用。
以下示例演示如何设置和读取Cookie:
package mainimport ( "fmt" "net/http" "time")func setCookieHandler(w http.ResponseWriter, req *http.Request) { // 初始化Cookie(使用命名字段) cookie := &http.Cookie{ Name: "my_session_id", Value: "abcdef123456", Path: "/", Domain: "localhost", Expires: time.Now().Add(24 * time.Hour), MaxAge: 86400, // 与Expires互斥,优先使用 Secure: false, // 开发环境设为false HttpOnly: true, SameSite: http.SameSiteLaxMode, } // 设置Cookie到响应头 http.SetCookie(w, cookie) fmt.Fprintf(w, "Cookie '%s' set successfully!", cookie.Name)}func readCookieHandler(w http.ResponseWriter, req *http.Request) { // 读取指定Cookie cookie, err := req.Cookie("my_session_id") if err != nil { if err == http.ErrNoCookie { fmt.Fprintf(w, "Cookie not found.") return } http.Error(w, "Error reading cookie: "+err.Error(), http.StatusInternalServerError) return } fmt.Fprintf(w, "Cookie value: %s", cookie.Value)}func main() { http.HandleFunc("/set", setCookieHandler) http.HandleFunc("/read", readCookieHandler) fmt.Println("Server started on :8080. Visit /set to set cookie, then /read to read it.") http.ListenAndServe(":8080", nil)}运行步骤默认使用SameSiteLax平衡安全性和用户体验。
若需跨站共享Cookie(如第三方登录),使用SameSiteNone并确保Secure: true。
在Go语言中设置HTTP Cookie的核心步骤如下:
遵循这些实践,可确保Cookie在用户会话管理、个性化设置等场景中安全高效地运行。