Gin 中的 Session
# 1、Session 简单介绍
session 是另一种记录客户状态的机制,不同的是 Cookie 保存在客户端浏览器中,而 session 保存在服务器上。
# 2、Session 的工作流程
当客户端浏览器第一次访问服务器并发送请求时,服务器端会创建一个 session 对象,生成一个类似于key - value
的键值对,然后将 value 保存到服务器,将 key(cookie)返回到浏览器(客户)端。浏览器下次访问时会携带 key(cookie),找到对应的 session(value)。
# 3、Gin 中使用 Session
Gin 官方没有给我们提供 Session 相关的文档,这个时候我们可以使用第三方的 Session 中间件来实现
https://github.com/gin-contrib/sessions (opens new window)
gin-contrib/sessions 中间件支持的存储引擎:
- cookie
- memstore
- redis
- memcached
- mongodb
# 4、基于 Cookie 存储 Session
1、安装 session 包
go get github.com/gin-contrib/sessions
2、基本的 session 用法
package main
import (
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
// 创建基于 cookie 的存储引擎,secret11111 参数是用于加密的密钥
store := cookie.NewStore([]byte("secret11111"))
// 设置 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, // 6hrs
})
//设置 Session
session.Set("username", "张三")
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})
})
r.Run(":9090")
}
# 5、基于 Redis 存储 Session
如果我们想将 session 数据保存到 redis 中,只要将 session 的存储引擎改成 redis 即可。
使用 redis 作为存储引擎的例子:
首先安装 redis 存储引擎的包
go get github.com/gin-contrib/sessions/redis
例子:
package main
import (
"fmt"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/redis"
"github.com/gin-gonic/gin"
"log"
)
func main() {
r := gin.Default()
// 初始化基于 redis 的存储引擎
// 参数说明:
// 第 1 个参数 - redis 最大的空闲连接数
// 第 2 个参数 - 数通信协议 tcp 或者 udp
// 第 3 个参数 - redis 地址, 格式,host:port
// 第 4 个参数 - redis 用户名
// 第 5 个参数 - redis 密码
// 第 6 个参数 - session 加密密钥
store, err := redis.NewStore(10, "tcp", "127.0.0.1:6379", "", "", []byte("secret3333"))
if err != nil {
log.Fatalf("Failed to create Redis store: %v", err)
}
r.Use(sessions.Sessions("mysession333", store))
r.GET("/", func(c *gin.Context) {
session := sessions.Default(c)
fmt.Println("session:", session)
fmt.Println("session.Session():", session.ID()) // 可能是 nil!
session.Set("username", "李四")
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})
})
r.Run(":9090")
}
上次更新: 2025/04/07, 23:46:20