gin框架设置/获取cookie和多个二级域名共享cookie
Cookie介绍
HTTP是无状态协议。
简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页面,
服务器无法认识到这是同一个浏览器在访问同一个网站。
每一次的访问,都是没有任何关系的。
如果我们要实现多个页面之间共享数据的话我们就可以使用Cookie或者Session实现
cookie是存储于访问者计算机的浏览器中。
可以让我们用同一个浏览器访问同一个域名的时候共享数据。
Cookie能实现的功能
1、保持用户登录状态
2、保存用户浏览的历史记录
3、猜你喜欢,智能推荐
4、电商网站的加入购物车
设置Cookie的语法
c.SetCookie("userName", "zs", 60, "/", "localhost", false, true)
第一个参数(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,
})
}


出处:https://www.cnblogs.com/ishoulgodo/
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,或者关注博主,在此感谢!
万水千山总是情,打赏5毛买辣条行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主(っ•̀ω•́)っ✎⁾⁾!
想问问题,打赏了卑微的博主,求求你备注一下的扣扣或者微信;这样我好联系你;(っ•̀ω•́)っ✎⁾⁾!
如果文中有什么错误,欢迎指出。以免更多的人被误导。

浙公网安备 33010602011771号