1 )路由处理
package routers
import (
	"gin-demo/controllers/web"
	"github.com/gin-gonic/gin"
)
func WebRoutersInit(r *gin.Engine) {
	webRouters := r.Group("/")
	{
		webRouters.GET("/", web.WebCtrl{}.Index)
		webRouters.GET("/setcookie", web.WebCtrl{}.SetCookie)
		webRouters.GET("/getcookie", web.WebCtrl{}.GetCookie)
		webRouters.GET("/delcookie", web.WebCtrl{}.DelCookie)
	}
}
 
2 ) 控制器处理
package web
import (
	"net/http"
	"github.com/gin-gonic/gin"
)
type WebCtrl struct{}
// 设置 cookie
func (con WebCtrl) SetCookie(c *gin.Context) {
	// 设置 cookie
	// 第一个
	c.SetCookie("username", "张三", 3600, "/", "localhost", false, true)
	// 第二个
	c.SetCookie("hobby", "吃饭 睡觉", 5, "/", "localhost", false, true)
	// 响应
	c.String(http.StatusOK, "set cookie")
}
// 获取 cookie
func (con WebCtrl) GetCookie(c *gin.Context) {
	// 获取 cookie
	username, _ := c.Cookie("username")
	hobby, _ := c.Cookie("hobby")
	// 响应
	c.String(http.StatusOK, "username=%v----hobby=%v", username, hobby)
}
// 删除 cookie
func (con WebCtrl) DelCookie(c *gin.Context) {
	// 删除 cookie
	c.SetCookie("username", "张三", -1, "/", "localhost", false, true) // 删除一个
	// 响应
	c.String(http.StatusOK, "delete cookie")
}
 
设置cookie时,设置了两个不同过期时间的cookie
5s 后第一个cookie 自动丢失
访问 /delcookie 路由,第二个路由被主动删除
HTTP 是无状态协议,当你浏览了一个页面
然后转到同一个网站的另一个页面,服务器无法认识到这是同一个浏览器在访问同一个网站
每一次的访问,都是没有任何关系的
如果我们要实现多个页面之间共享数据的话
我们就可以使用 Cookie 或者 Session 实现
cookie 是存储于访问者计算机的浏览器中
可以让我们用同一个浏览器访问同一个域名的时候共享数据
所以,cookie的功能
cookie的文档
设置cookie时的API
多级域名共享 cookie
概述
1 ) 单单使用 cookie 的限制
2 )基于 cookie 的 session 技术
示例
1 )主程序配置 在 main.go 中
package main
import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
)
func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	
	// ... 跳过其他
	
	// 在路由配置之上,配置session中间件
	cookieSessionSecret := "sdfdssdsfs_s?d2sdfsf@^s_" // 是用于加密的密钥
	// 创建基于 cookie 的存储引擎
	store := cookie.NewStore([]byte(cookieSessionSecret))
	// 配置session的中间件 store是前面创建的存储引擎,我们可以替换成其他存储引擎
	r.Use(sessions.Sessions("xxproject_session", store))
	
	// ... 跳过其他
}
 
2 ) 路由配置
package routers
import (
	"gin-demo/controllers/web"
	"github.com/gin-gonic/gin"
)
func WebRoutersInit(r *gin.Engine) {
	webRouters := r.Group("/")
	{
		webRouters.GET("/", web.WebCtrl{}.Index)
		webRouters.GET("/setsession", web.WebCtrl{}.SetSession)
		webRouters.GET("/getsession", web.WebCtrl{}.GetSession)
		webRouters.GET("/delsession", web.WebCtrl{}.DelSession)
	}
}
 
3 ) controller 控制器
package web
import (
	"net/http"
	"github.com/gin-contrib/sessions" // 则个是用于 直接获取 cookie 内容的
	"github.com/gin-gonic/gin"
)
type WebCtrl struct{}
// 设置 session
func (con WebCtrl) SetSession(c *gin.Context) {
	session := sessions.Default(c)
	// 配置session的过期时间
	session.Options(sessions.Options{
		// MaxAge: 3600 * 6, // 6hrs   MaxAge单位是秒
		MaxAge: 5, // 5 s 过期
	})
	session.Set("username", "张三 111")
	session.Save() // 设置session的时候必须调用
	// 响应
	c.String(http.StatusOK, "set session: %v", session.Get("username"))
}
// 获取 session
func (con WebCtrl) GetSession(c *gin.Context) {
	session := sessions.Default(c)
	username := session.Get("username")
	// 响应
	c.String(http.StatusOK, "get session username=%v", username)
}
// 删除 session
func (con WebCtrl) DelSession(c *gin.Context) {
	session := sessions.Default(c)
	session.Delete("username")
	session.Save() // 这将从 Cookie中 中删除 session 数据
	username := session.Get("username") // 获取 session username
	// 响应
	c.String(http.StatusOK, "delete session %v", username)
}
 
概述
示例
1 )主程序 main.go
package main
import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/redis"
	"github.com/gin-gonic/gin"
)
func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	
	// ... 跳过其他
	
	// 在路由配置之上,配置session中间件
	redisSessionSecret := "sdfdssdsfs_s?d2sdfsf@^s_" // 是用于加密的密钥
	// 配置session中间件
	
	store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte(redisSessionSecret))
	r.Use(sessions.Sessions("mysession", store))
	// ... 跳过其他
}
 
2 ) 路由和控制器同上面的 cookie based session 示例,这里不再赘述
3 )注意