设置和获取 Cookie | Gin Web Framework (gin-gonic.com)https://gin-gonic.com/zh-cn/docs/examples/cookie/
cookie在互联网上随处可见,具体体现如下:
保持登录状态保存浏览器的历史记录大数据随心配,按喜好推送讯息购物网站加入购物车
都会用到cookie来保存一些信息;
Set-Cookie将Set-Cookie标头添加到ResponseWriter的标头中。提供的cookie必须有一个有效的名称。无效的cookie可能会被无提示地删除。
ctx.SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)
第一个参数 key第二个参数 value第三个参数 过期时间 . 如果只想设置 Cookie 的保存路径而不想设置存活时间,可以在第三个参数中传递 nil第四个参数 cookie 的路径第五个参数 cookie 的路径 Domain 作用域 本地调试配置成 localhost , 正式上线配置成域名第六个参数是 secure ,当 secure 值为 true 时, cookie 在 HTTP 中是无效,在 HTTPS 中才有效第七个参数 httpOnly ,是微软对 COOKIE 做的扩展。如果在 COOKIE 中设置了 “httpOnly” 属性,则通过程序(JS 脚本、 applet 等)将无法读取到 COOKIE 信息,防止 XSS 攻击产生
cookie, err := ctx.Cookie("name")
- package test
-
- import (
- "fmt"
- "gindemo04/models"
- "net/http"
-
- "github.com/gin-gonic/gin"
- )
-
- type ModelTest struct{}
- //也就是有一个控制器是设定cookie的,有去取cookies的(先取set再去取才有值)
- func (con ModelTest) Index(c *gin.Context) {
- //设置cookie
- c.SetCookie("username", "卫宫士郎", 3600, "/", "localhost", false, true)
- fmt.Println(models.UnixToTime(1757814260))
- c.HTML(http.StatusOK, "default/index.html", gin.H{
- "msg": "model测试内容--转换时间戳---如下:",
- "t": 1757814260,
- })
- }
- func (con ModelTest) News(c *gin.Context) {
- //获取cookie
- username,_ := c.Cookie("username")
- delay ,_:=c.Cookie("delay")
- c.String(http.StatusOK, "cookie=%v,delay=%v",username,delay)
- }
-
- func (con ModelTest) Gouwu(c *gin.Context) {
- //获取cookie
- username,_ := c.Cookie("username")
- c.String(http.StatusOK, "cookie="+username)
- }
-
- package routers
-
- import (
- "gindemo04/controllers/test"
-
- "github.com/gin-gonic/gin"
- )
-
- func DefaultRouters(r *gin.Engine) {
- defaultRouters := r.Group("/")
- {
- defaultRouters.GET("/", test.ModelTest{}.Index)
- defaultRouters.GET("/news", test.ModelTest{}.News)
- defaultRouters.GET("/gouwu", test.ModelTest{}.Gouwu)
-
- }
- }
注意:这里为了方便,将main.go的端口设置为了80
可以设置如下:
- package test
-
- import (
- "fmt"
- "gindemo04/models"
- "net/http"
-
- "github.com/gin-gonic/gin"
- )
-
- type ModelTest struct{}
- //也就是有一个控制器是设定cookie的,有去取cookies的(先取set再去取才有值)
- func (con ModelTest) Index(c *gin.Context) {
- //设置cookie
- c.SetCookie("username", "卫宫士郎", 3600, "/", "localhost", false, true)
- //过期cookie设置
- c.SetCookie("delay", "过期演示", 3, "/", "localhost", false, true)
-
- fmt.Println(models.UnixToTime(1757814260))
- c.HTML(http.StatusOK, "default/index.html", gin.H{
- "msg": "model测试内容--转换时间戳---如下:",
- "t": 1757814260,
- })
- }
- func (con ModelTest) News(c *gin.Context) {
- //获取cookie
- username,_ := c.Cookie("username")
- delay ,_:=c.Cookie("delay")
- c.String(http.StatusOK, "cookie=%v,delay=%v",username,delay)
- }
-
- func (con ModelTest) Gouwu(c *gin.Context) {
- //获取cookie
- username,_ := c.Cookie("username")
- c.String(http.StatusOK, "cookie="+username)
- }
-
- func (con ModelTest) Deletcookie(c *gin.Context) {
- //删除cookie
- c.SetCookie("username", "卫宫士郎", -1, "/", "localhost", false, true)
- c.String(http.StatusOK, "删除cookie完毕,查看gouwu以及news是否还存在cookie的值")
- }
- package routers
-
- import (
- "gindemo04/controllers/test"
-
- "github.com/gin-gonic/gin"
- )
-
- func DefaultRouters(r *gin.Engine) {
- defaultRouters := r.Group("/")
- {
- defaultRouters.GET("/", test.ModelTest{}.Index)
- defaultRouters.GET("/news", test.ModelTest{}.News)
- defaultRouters.GET("/gouwu", test.ModelTest{}.Gouwu)
- defaultRouters.GET("/deletcookie", test.ModelTest{}.Deletcookie)
- }
- }
再去查看gouwu就没有cookie了
设置时间短一些
- package test
-
- import (
- "fmt"
- "gindemo04/models"
- "net/http"
-
- "github.com/gin-gonic/gin"
- )
-
- type ModelTest struct{}
- //也就是有一个控制器是设定cookie的,有去取cookies的(先取set再去取才有值)
- func (con ModelTest) Index(c *gin.Context) {
- //设置cookie
- c.SetCookie("username", "卫宫士郎", 3600, "/", "localhost", false, true)
- //过期cookie设置
- c.SetCookie("delay", "过期演示", 5, "/", "localhost", false, true)
- //二级域名cookie共享(联想百度账号登录百度后,再去使用百度天气可以看自己收藏的地域天气的操作)
- fmt.Println(models.UnixToTime(1757814260))
- c.HTML(http.StatusOK, "default/index.html", gin.H{
- "msg": "model测试内容--转换时间戳---如下:",
- "t": 1757814260,
- })
- }
- func (con ModelTest) News(c *gin.Context) {
- //获取cookie
- username,_ := c.Cookie("username")
- delay ,_:=c.Cookie("delay")
- c.String(http.StatusOK, "cookie=%v,delay=%v",username,delay)
- }
-
- func (con ModelTest) Gouwu(c *gin.Context) {
- //获取cookie
- username,_ := c.Cookie("username")
- c.String(http.StatusOK, "cookie="+username)
- }
-
- func (con ModelTest) Deletcookie(c *gin.Context) {
- //删除cookie
- c.SetCookie("username", "卫宫士郎", -1, "/", "localhost", false, true)
- c.String(http.StatusOK, "删除cookie完毕,查看gouwu以及news是否还存在cookie的值")
- }
再次刷新 ,没了
举个例子:
联想百度账号登录百度后,再去使用百度天气可以看自己收藏的地域天气的操作
分别把 a.frank.com 和 b.frank.com 解析到我们的服务器我们想的是用户在 a.frank.com 中设置 Cookie 信息后在 b.frank.com 中获取刚才设置的cookie,也就是实现多个二级域名共享 cookie
在本机操作域名解析的话,需要修改C:\Windows\System32\drivers\etc下的hosts文件
最后是这个效果
- package test
-
- import (
- "fmt"
- "gindemo04/models"
- "net/http"
-
- "github.com/gin-gonic/gin"
- )
-
- type ModelTest struct{}
- //也就是有一个控制器是设定cookie的,有去取cookies的(先取set再去取才有值)
- func (con ModelTest) Index(c *gin.Context) {
- //二级域名cookie共享(联想百度账号登录百度后,再去使用百度天气可以看自己收藏的地域天气的操作)
- c.SetCookie("username","卫宫士郎",3600,"/",".frank.com",false,true)
- fmt.Println(models.UnixToTime(1757814260))
- c.HTML(http.StatusOK, "default/index.html", gin.H{
- "msg": "model测试内容--转换时间戳---如下:",
- "t": 1757814260,
- })
- }
- func (con ModelTest) News(c *gin.Context) {
- //获取cookie
- username,_ := c.Cookie("username")
- c.String(http.StatusOK, "cookie="+username)
- }
-
- package routers
-
- import (
- "gindemo04/controllers/test"
-
- "github.com/gin-gonic/gin"
- )
-
- func DefaultRouters(r *gin.Engine) {
- defaultRouters := r.Group("/")
- {
- defaultRouters.GET("/", test.ModelTest{}.Index)
- defaultRouters.GET("/news", test.ModelTest{}.News)
-
- }
- }
a.frank.com可以
b.frank.com也可以