Golang Cookie 介绍

发布时间: 更新时间: 总字数:976 阅读时间:2m 作者: IP上海 分享 网址

在 Golang 中使用 http.SetCookie 设置 cookie 时,http.Cookie 结构体中的 Domain 字段是一个非常重要的属性,它决定了哪些域名可以接收和发送这个 cookie。

介绍

以下是关于 http.CookieDomain 字段的要求和注意事项:

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.comblog.example.com 等所有 example.com 的子域名。

2. 规则和限制

  • 当前域或父域: 服务器只能将 Domain 属性设置为自己的域名或其父域。例如,foo.example.com 上的服务器可以将 Domain 设置为 foo.example.comexample.com,但不能设置为 bar.foo.example.comelsewhere.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.comapi.example.com 等)的请求中被发送。

总结

在使用 http.CookieDomain 属性时,请务必考虑其作用范围,以确保 cookie 可以在你期望的域名上正常工作。正确设置 Domain 对于跨子域共享会话或用户状态至关重要。

Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数