本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Gin 中的Session
session概述
session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而session保存在服务器上。
session的工作流程
当客户端浏览器第一次访问服务器并发送请求时,服务器端会创建一个session 对象,生成一个类似于 key,value 的键值对,然后将 value 保存到服务器 将 key(cookie)返回到浏览器(客户)端。浏览器下次访问时会携带 key(cookie),找到对应的 session(value)。
Gin 中使用 Session
gin框架官方是没有给出session的相关文档,这时候我们又得自己去找第三方的session中间件来使用了。
gin-contrib/sessions 中间件支持的存储引擎:
• cookie
• memstore
• redis
• memcached
• mongodb
基于 Cookie 存储 Session
1、安装 session 包
go get github.com/gin-contrib/sessions
2、基本用法(基于cookie)
// 创建基于 cookie 的存储引擎,secret12345 参数是用于加密的密钥,可以随意取,难点比较好
store := cookie.NewStore([]byte("secret12345"))
// 设置 session 中间件,参数 mysession,指的是 session 的名字,也是cookie 的名字// store 是前面创建的存储引擎,我们可以替换成其他存储引擎r.Use(sessions.Sessions("mysession", store))
r.GET("/", func(c *gin.Context) {
//初始化 session 对象
session := sessions.Default(c)
//设置过期时间
session.Options(sessions.Options{
MaxAge: 3600 * 6, // 6小时
})
//设置 Session
session.Set("username", "aaa") //aaa可更换为用户前端输入的值或者变量
session.Save() //存储
c.JSON(200, gin.H{"msg": session.Get("username")})
})
r.GET("/user", func(c *gin.Context) {
// 初始化 session 对象
session := sessions.Default(c)
// 通过 session.Get 读取 session 值
username := session.Get("username")
c.JSON(200, gin.H{"username": username})
})
3、基本用法(基于redis)
安装 redis 存储引擎的包
go get github.com/gin-contrib/sessions/redis
关键代码:
// 初始化基于 redis 的存储引擎
// 参数说明:
// 参数 10: - redis 最大的空闲连接数
// 参数 tcp - 数通信协议 tcp 或者 udp
// 参数localhost:6379 - redis 地址, 格式,host:port
// 参数12345 - redis 密码
// 参数[]byte("secret") - session 加密密钥
store, _ := redis.NewStore(10, "tcp", "localhost:6379", "12345", []byte("secret"))
r.Use(sessions.Sessions("mysession", store))
r.GET("/", func(c *gin.Context) {
session := sessions.Default(c)
session.Set("username", "aaa")
session.Save()
c.JSON(200, gin.H{"username": session.Get("username")
})
})
r.GET("/user", func(c *gin.Context) {
// 初始化 session 对象
session := sessions.Default(c)
// 通过 session.Get 读取 session 值
username := session.Get("username")
c.JSON(200, gin.H{"username": username})
})