gin框架设置/获取cookie和多个二级域名共享cookie

Cookie介绍

HTTP是无状态协议。

简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页面,

服务器无法认识到这是同一个浏览器在访问同一个网站。

每一次的访问,都是没有任何关系的。

如果我们要实现多个页面之间共享数据的话我们就可以使用Cookie或者Session实现

cookie是存储于访问者计算机的浏览器中。

可以让我们用同一个浏览器访问同一个域名的时候共享数据。

Cookie能实现的功能

1、保持用户登录状态

2、保存用户浏览的历史记录

3、猜你喜欢,智能推荐

4、电商网站的加入购物车

Cookie的使用

第一个参数(name) key(键名)

第二个参数(value) value(键值)

第三个参数过期时间(expire),但是是秒。不想设置存活时间,可以在第三个参数中传递 nil。

大于 0:Cookie 将在指定的秒数后过期。你设置的 60 表示这个 Cookie 会在 60 秒后失效。

等于 0:将创建一个"会话 Cookie",它会在用户关闭浏览器时被删除。

小于 0(通常设为 -1):这相当于删除该 Cookie。

第四个参数(path),设置为 "/" 意味着这个 Cookie 对整个网站(所有路径)都有效。

第五个参数(domain),指定 Cookie 所属的域名。浏览器只会将 Cookie 发送给该域名下的请求。

在开发环境中,通常使用 "localhost"。

在生产环境中,你需要将其替换为你的实际域名,例如 "yourdomain.com"。

第六个参数(secure),一个布尔值,用于控制 Cookie 的传输安全性,

当设置为 true 时,该 Cookie 只能通过 HTTPS 加密连接发送给服务器。

你当前设置为 false,意味着在 HTTP 和 HTTPS 连接下都可以发送。

安全建议:在生产环境中,强烈建议将其设置为 true,以防止 Cookie 在不安全的网络中被窃取

第七个参数(httpOnly),用于增强安全性,防止跨站脚本攻击(XSS)。

当设置为 true 时,Cookie 将无法通过客户端 JavaScript 的 document.cookie API访cookie。

以下是图片内容转换成的 Markdown 格式文档:

# 参数 你的值 含义
1 name "userName" cookie 的键名,后面 c.Cookie("userName") 靠它取回
2 value "zs" cookie 的值。Gin 会自动 url.QueryEscape 编码(中文、空格会被转义),读取时 c.Cookie() 自动解码
3 maxAge 60 有效期,单位是秒(不是分钟!)。>0 有效期;0 是会话 cookie(关浏览器消失);<0 表示删除该 cookie
4 path "/" 生效路径范围 。/ 表示全站共享,/user/list 设置的 cookie 在 /user/detail、/shop/list 都会带;传空字符串 Gin 会自动补 "/"
5 domain "localhost" 生效域名。只有访问该域名(及其子域名)时浏览器才回传此 cookie
6 secure false 是否只在 HTTPS 下发送 。true 时 HTTP 站点(你现在的 8087)浏览器不会保存
7 httpOnly true true 则前端 JS 无法通过 document.cookie 读取,只能由后端读取,可防 XSS 窃取

给某个请求设置Cookie

通过 c.SetCookie 方法设置 Cookie。

通过 c.Cookie 方法获取 Cookie。

获取 Cookie 的值时,如果 Cookie 不存在,会返回空字符串和 nil。

复制代码
package controllers

import (
	"fmt"
	"gin-quickstart/modules"

	"github.com/gin-gonic/gin"
)

type UserController struct {
}

func (u UserController) UserList(c *gin.Context) {
	//获取中间件设置的值
	userName, _ := c.Get("userName")
	fmt.Printf("获取中间件的值,userName的值是: %v,\n", userName)
	// 设置cookie,过期时间为60秒
	// 路径为"/"
	// 域名为为"localhost"
	// 不安全
	// 不通过JS访问
	c.SetCookie("userName", "zs", 60, "/", "localhost", false, true)
	c.JSON(200, gin.H{
		"msg":  "获取用户列表成功",
		"time": modules.GetTime(),
	})
}

func (u UserController) UserDetail(c *gin.Context) {
	// 获取cookie的值
	userName, _ := c.Cookie("userName")
	fmt.Printf("获取cookie的值,userName的值是: %v,\n", userName)
	c.JSON(200, gin.H{
		"msg":    "获取用户详情成功",
		"cookie": userName,
	})
}

我们在 http://localhost:8087/user/list路径下,

在浏览器的控制台的 Application 标签下,

cookies 下可以看到cookie。

多个二级域名共享cookie

我们想实现 a.aliabc.com 和 a.aliabc.com 共享 cookie。

域名来解析ip

在 C:\Windows\System32\drivers\etc\hosts 文件中

配置如下:

复制代码
127.0.0.1 a.aliabc.com
127.0.0.1 b.aliabc.com

它的意思是:a.aliabc.com 和 a.aliabc.com 都解析到 127.0.0.1 这个 ip。

这样我们就可以在浏览器中访问这两个域名了。

http://127.0.0.1:8087/user/list 和

a.aliabc.com:8087/user/list

b.aliabc.com:8087/user/list

都可以访问到用户列表页面。

实现多个二级域名共享cookie

浏览器A标签中输入:http://a.aliabc.com:8087/user/list

浏览器B标签中输入:http://b.aliabc.com:8087/user/detail

都可以获取到cookie了

复制代码
package controllers

import (
	"fmt"
	"gin-quickstart/modules"

	"github.com/gin-gonic/gin"
)

type UserController struct {
}

func (u UserController) UserList(c *gin.Context) {
	//获取中间件设置的值
	userName, _ := c.Get("userName")
	fmt.Printf("获取中间件的值,userName的值是: %v,\n", userName)
	// 设置cookie,.aliabc.com 所有的二级域名都可以访问到
	c.SetCookie("userName", "zs20161016", 600, "/", ".aliabc.com", false, true)
	c.JSON(200, gin.H{
		"msg":  "获取用户列表成功",
		"time": modules.GetTime(),
	})
}

func (u UserController) UserDetail(c *gin.Context) {
	// 获取cookie
	userName, _ := c.Cookie("userName")
	fmt.Printf("获取cookie的值,userName的值是: %v,\n", userName)
	c.JSON(200, gin.H{
		"msg":    "获取用户详情成功",
		"cookie": userName,
	})
}