
http cookie 是一种由服务器发送到用户浏览器并存储在浏览器中的小型文本文件。它的主要作用是记录用户状态,例如用户登录信息、购物车内容、个性化设置等,以便在用户后续访问同一网站时,浏览器能将这些 cookie 随请求一同发送回服务器。
当服务器希望在客户端设置一个 Cookie 时,它会通过 HTTP 响应头中的 Set-Cookie 字段来指示浏览器。浏览器接收到这个响应头后,会解析其中的 Cookie 信息并将其存储起来。在后续对同一域名的请求中,浏览器会自动将这些存储的 Cookie 添加到请求头中的 Cookie 字段,发送给服务器。
在 Go 语言的 net/http 包中,正确地从服务器端设置 Cookie 是一个常见需求,但有时会因对 http.Request 和 http.ResponseWriter 职责的混淆而导致错误。
许多初学者可能会尝试通过 http.Request 对象来设置 Cookie,例如使用 req.AddCookie() 方法。然而,这是一个常见的误解。http.Request 对象代表的是客户端发送到服务器的请求,其上的 AddCookie() 方法主要用于在 Go 客户端发起 HTTP 请求时,向 该请求 中添加 Cookie,以便将它们发送到 另一个服务器。
例如:
立即学习“go语言免费学习笔记(深入)”;
// 这是一个客户端请求的例子,与服务器端设置Cookie无关
client := &http.Client{}
req, _ := http.NewRequest("GET", "http://example.com", nil)
cookie := &http.Cookie{Name: "auth", Value: "token123"}
req.AddCookie(cookie) // 将Cookie添加到要发送出去的请求中
resp, _ := client.Do(req)
// ... 处理响应当我们需要服务器向浏览器发送 Cookie 时,我们操作的是 http.ResponseWriter 对象,因为它负责构建并发送 HTTP 响应。
在 Go 语言中,要从服务器端设置 Cookie,需要使用 http.ResponseWriter 接口配合 http.SetCookie 函数。这个函数会负责生成正确的 Set-Cookie HTTP 响应头,并将其添加到发送给客户端的响应中。
核心步骤如下:
下面是一个完整的 Go Web 服务器示例,演示了如何正确地在响应中设置 Cookie:
package main
import (
"fmt"
"net/http"
"time"
)
// setCookieHandler 负责在 HTTP 响应中设置一个 Cookie
func setCookieHandler(w http.ResponseWriter, r *http.Request) {
// 1. 定义 Cookie 的过期时间
// 这里设置为当前时间起 24 小时后过期
expiration := time.Now().Add(24 * time.Hour)
// 2. 创建一个 http.Cookie 结构体实例
// 此 Cookie 将在客户端浏览器中存储,并随后续请求发送回服务器。
cookie := &http.Cookie{
Name: "user_session", // Cookie 的名称,用于标识
Value: "abcdef1234567890", // Cookie 的值,通常是会话ID或令牌
Path: "/", // Cookie 的作用路径,"/" 表示对整个网站有效
// Domain: "localhost", // 可选:指定 Cookie 所属的域名。
// 如果未设置,默认为当前请求的域名。
// 注意:不能设置为其他域名,只能是当前域名或其子域名。
Expires: expiration, // 设置 Cookie 的绝对过期时间
// MaxAge: 86400, // 可选:设置 Cookie 的最大存活时间(秒)。
// 如果同时设置 Expires 和 MaxAge,MaxAge 优先级更高(在某些浏览器中)。
HttpOnly: true, // 设为 true 可防止客户端脚本(如 JavaScript)访问 Cookie,增加安全性
Secure: false, // 设为 true 仅在 HTTPS 连接中发送 Cookie。
// 生产环境强烈建议设置为 true。
SameSite: http.SameSiteLax, // 增加 CSRF 保护,推荐设置。
// 可选值:http.SameSiteDefaultMode, http.SameSiteLaxMode, http.SameSiteStrictMode, http.SameSiteNoneMode
}
// 3. 使用 http.SetCookie 函数将 Cookie 添加到 HTTP 响应头中
// 这个函数会生成一个 "Set-Cookie" 响应头,发送给客户端浏览器。
http.SetCookie(w, cookie)
fmt.Fprintf(w, "Cookie 'user_session' 已成功设置。请检查浏览器开发者工具中的Cookie。")
}
// main 函数启动 HTTP 服务器并注册处理函数
func main() {
http.HandleFunc("/set-cookie", setCookieHandler) // 注册设置 Cookie 的路由
fmt.Println("服务器正在监听 :8080,请访问 http://localhost:8080/set-cookie")
err := http.ListenAndServe(":8080", nil) // 启动服务器
if err != nil {
fmt.Printf("服务器启动失败: %v\n", err)
}
}运行上述代码后,访问 http://localhost:8080/set-cookie,你将在浏览器开发者工具的网络请求响应头中看到 Set-Cookie 字段,并且在浏览器存储中找到名为 user_session 的 Cookie。
http.Cookie 结构体定义了 Cookie 的各种属性:
在 Go 语言中,通过 net/http 包从服务器端设置 Cookie 的核心在于理解 http.ResponseWriter 的作用,并正确使用 http.SetCookie 函数和 http.Cookie 结构体。避免在 http.Request 上操作 Cookie 是关键。遵循 Secure、HttpOnly 和 SameSite 等安全属性的最佳实践,能够有效提高 Web 应用程序的安全性,并为用户提供更稳定可靠的体验。
以上就是Golang net/http 包实现服务器端 Cookie 管理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号