
http cookie(通常简称为cookie)是服务器发送到用户浏览器并保存在本地的一小段文本信息。每当浏览器后续向同一服务器发送请求时,都会将该cookie信息发送回服务器。cookie主要用于以下目的:
在Go语言中,net/http包提供了强大的功能来构建HTTP服务器和客户端,其中包括对Cookie的完善支持。
许多初学者在尝试使用Go语言设置Cookie时,可能会遇到一个常见的误区:试图将Cookie添加到http.Request对象中。例如,以下代码片段展示了这种错误的做法:
// 错误的示例:尝试将Cookie添加到http.Request
func indexHandler(w http.ResponseWriter, req *http.Request) {
expire := time.Now().AddDate(0, 0, 1)
cookie := http.Cookie{
Name: "test",
Value: "tcookie",
Path: "/",
Domain: "www.domain.com",
Expires: expire,
HttpOnly: true,
Secure: true,
}
req.AddCookie(&cookie) // 错误!Cookie应该设置在响应上
io.WriteString(w, "Hello world!")
}这里的问题在于,http.Request对象代表的是客户端发送到服务器的请求。它包含客户端已经发送过来的Cookie。而我们想要实现的是服务器将Cookie发送回客户端,这需要操作http.ResponseWriter对象,该对象负责构建服务器的响应。将Cookie添加到req.AddCookie并不会将Cookie发送给客户端,它只会影响当前请求对象对Cookie的内部管理,这显然不是我们期望的结果。
在Go语言中,正确地从服务器端设置Cookie需要使用net/http包提供的http.SetCookie函数。这个函数接收两个参数:一个http.ResponseWriter和一个*http.Cookie指针。
立即学习“go语言免费学习笔记(深入)”;
func SetCookie(w ResponseWriter, cookie *Cookie)
该函数会将一个Set-Cookie头部添加到HTTP响应中,指示客户端浏览器设置或更新相应的Cookie。
下面是一个完整的、正确的Go语言HTTP服务器设置Cookie的示例:
package main
import (
"fmt"
"net/http"
"time"
)
// indexHandler 处理根路径的HTTP请求
func indexHandler(w http.ResponseWriter, req *http.Request) {
// 1. 创建一个http.Cookie对象
// Cookie的过期时间设置为当前时间加24小时
expiration := time.Now().Add(24 * time.Hour)
cookie := http.Cookie{
Name: "user_session", // Cookie的名称
Value: "abcdef123456", // Cookie的值
Path: "/", // Cookie的有效路径,"/"表示对所有路径都有效
// Domain: "example.com", // Cookie的有效域名,通常留空表示当前域名
Expires: expiration, // Cookie的过期时间
HttpOnly: true, // 设置为true,禁止客户端JavaScript访问Cookie,增强安全性
Secure: false, // 设置为true,Cookie只通过HTTPS发送,增强安全性(开发环境可设为false)
SameSite: http.SameSiteLaxMode, // 防止跨站请求伪造(CSRF)攻击,推荐设置
}
// 2. 使用http.SetCookie将Cookie添加到HTTP响应中
http.SetCookie(w, &cookie)
// 3. 向客户端发送响应内容
fmt.Fprintf(w, "Hello, world! Cookie 'user_session' has been set.")
}
func main() {
// 注册HTTP请求处理器
http.HandleFunc("/", indexHandler)
// 启动HTTP服务器监听8080端口
fmt.Println("Server started on :8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
fmt.Printf("Server failed to start: %v\n", err)
}
}运行上述代码后,访问http://localhost:8080,你的浏览器将会收到一个名为user_session的Cookie。你可以通过浏览器的开发者工具查看该Cookie是否成功设置。
http.Cookie结构体定义了Cookie的各种属性,理解这些属性对于正确和安全地使用Cookie至关重要:
在Go语言的net/http包中,从服务器端设置HTTP Cookie的关键在于理解http.ResponseWriter的角色,并正确使用http.SetCookie函数。通过实例化http.Cookie结构体并配置其各项属性(如Name, Value, Expires, HttpOnly, Secure, SameSite等),开发者可以精确控制Cookie的行为和安全性。遵循本文提供的指导和最佳实践,将有助于构建健壮、安全的Web应用程序。
以上就是Go语言net/http包:服务器端正确设置HTTP Cookie的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号