在 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
对于跨子域共享会话或用户状态至关重要。