在 Golang 中使用 http.SetCookie 设置 cookie 时,http.Cookie 结构体中的 Domain 字段是一个非常重要的属性,它决定了哪些域名可以接收和发送这个 cookie。
介绍
以下是关于 http.Cookie 中 Domain 字段的要求和注意事项:
1. 作用
Domain 属性指定了可以接收该 cookie 的主机。如果设置了 Domain,该 cookie 将可用于指定的域名及其所有子域名。如果未设置 Domain,则该 cookie 仅可用于设置它的当前主机,不包括其子域名。
举个例子:
- 未设置
Domain: 如果你在 example.com 上设置了一个 cookie,并且没有指定 Domain,那么这个 cookie 只会被发送到 example.com。 - 设置
Domain: 如果你在 www.example.com 上设置了一个 cookie,并将 Domain 设置为 example.com,那么这个 cookie 将不仅会被发送到 www.example.com,还会被发送到 api.example.com 或 blog.example.com 等所有 example.com 的子域名。
2. 规则和限制
- 当前域或父域: 服务器只能将
Domain 属性设置为自己的域名或其父域。例如,foo.example.com 上的服务器可以将 Domain 设置为 foo.example.com 或 example.com,但不能设置为 bar.foo.example.com 或 elsewhere.com。 - 公共后缀: 你不能将
Domain 设置为公共后缀,例如 .com、.net、.co.uk 等。这样做是为了防止恶意网站设置一个可以被所有同后缀网站访问的 cookie。 - 域名匹配: 浏览器在发送请求时,会检查请求的域名是否与 cookie 的
Domain 属性匹配。如果匹配,并且 Path 等其他属性也满足要求,浏览器就会在请求头中携带该 cookie。 - 域名格式:
Domain 字段的值不应该包含端口号。 - 不以点开头(通常): 在 Go 中,设置
Domain 时,通常不应以点 . 开头。如果以 . 开头,Go 会在内部处理它。例如,如果你设置 Domain: ".example.com",Go 会将其视为 example.com。
代码示例
下面是一个在 Golang 中使用 http.SetCookie 设置 Domain 的例子:
package main
import (
"net/http"
"time"
)
func setCookieHandler(w http.ResponseWriter, r *http.Request) {
cookie := &http.Cookie{
Name: "my_session_id",
Value: "123456789",
Path: "/",
Domain: "example.com", // 设置为父域,使其对所有子域都可用
Expires: time.Now().Add(24 * time.Hour),
HttpOnly: true, // 仅允许 HTTP 请求访问,防止 JavaScript 访问
Secure: true, // 仅在 HTTPS 连接中发送
}
http.SetCookie(w, cookie)
w.Write([]byte("Cookie has been set!"))
}
func main() {
http.HandleFunc("/setcookie", setCookieHandler)
http.ListenAndServe(":8080", nil)
}
在上面的示例中,我们将 Domain 设置为 "example.com",这意味着这个 cookie 将在 example.com 及其所有子域名(例如 www.example.com、api.example.com 等)的请求中被发送。
总结
在使用 http.Cookie 的 Domain 属性时,请务必考虑其作用范围,以确保 cookie 可以在你期望的域名上正常工作。正确设置 Domain 对于跨子域共享会话或用户状态至关重要。