gin框架中的Session是通过中间件Middleware的方式来使用的, 官方的gin-contrib提供了session包(通过对github.com/gorilla/sessions的二次封装实现),我们可以直接使用即可, session支持的存储方式有如下多种:
memstore
:基于内存的实现,单体应用推荐方式。redis
:基于 Redis 的实现,多实例部署,分布式应用推荐方式 redis 实现。cookie
:基于cookie
的实现,不安全,一般不会使用。gorm
:基于 GORM 的实现memcached
:基于 Memcached 的实现mongo
:基于 MongoDB 的实现postgres
:基于 PostgreSQL 的实现tester
:用于测试的实现
1. 安装依赖包
go get -u github.com/gin-contrib/sessions
2. 选择合适的存储方式
要使用session 首先需要根据我们的业务场景选择一个合适的存储方式,单体应用建议memstore内存存储方式, 分布式应用建议使用redis。
3. 创建存储对象store
创建存储对象store, 我们需要先加载需要使用的存储方式的包,然后在使用包中提供的 NewStore函数即可创建对应的存储。
keyPairs ...[]byte参数说明
这里需要注意的是 keyPairs ...[]byte 这个参数, 这个是一个可变参数,我们可以传递2个,第一个keyPair是用于身份验证的密钥,推荐长度为 32或者64位; 第二个keypari是用于数据加密的(一般不设置),长度必须是16, 24, 或者32位的,他们对应的加密方式为 AES-128, AES-192, AES-256 , 不同的keypair长度对应的加密方式不一样。
常见的情况是设置单个身份验证密钥和可选的加密密钥。
如:新建memStore时我们是哟共32位的身份验证密匙, 使用AES-256加密方式(第二个keypairs长度为32)
store := memstore.NewStore( []byte("f1bf8649f8cdeac8d24dea5fc739a20f"),[]byte("45cf68b72fee96bada19da7df27667eb") )
4. 注册session中间件
Sessions中间件的函数定义 func sessions.Sessions(name string, store sessions.Store) gin.HandlerFunc
这里以memstore内存存储方式为例,其他的存储库使用类似
。
r := gin.Default() // gin Engine对象// 使用session中间件
r.Use(sessions.Sessions("mysession", store))
5. 在gin.HandlerFunc控制器中使用session
// 路由示例
r.GET("/ses", func(c *gin.Context) {// 从gin.Context中获取Session对象 这个在每次使用的时候都需要先获取这个对象session := sessions.Default(c)// 设置Sessionsession.Set("key", "Hello world")// 保存sessionsession.Save()// 获取sessionvalue := session.Get("key")c.JSON(200, gin.H{"message": "Session is: "+ value })
})// 启动服务
r.Run(":8080")
完整示例代码:
package mainimport ("github.com/gin-contrib/sessions""github.com/gin-contrib/sessions/memstore""github.com/gin-gonic/gin"
)func main() {// 初始化Gin引擎r := gin.Default()// 用内存存储 session// 这是基于内存的实现,memstore.NewStore函数原型 func NewStore(keyPairs ...[]byte) Store // 这里只有一个可变参数keyPairs, 我们可以传递2个参数, // 第一个参数是授权验证key, 建议长度 32 或者64 位// 第二个参数是可选的加密密匙,长度必须是16, 24, 或者32位的,// 他们对应的加密方式为 AES-128, AES-192, AES-256 , 不同的keypair长度对应的加密方式不一样。store := memstore.NewStore([]byte("f1bf8649f8cdeac8d24dea5fc739a20f"),[]byte("45cf68b72fee96bada19da7df27667eb"))r.Use(sessions.Sessions("mysession", store))// 路由示例r.GET("/ses", func(c *gin.Context) {// 从gin.Context中获取Session对象 这个在每次使用的时候都需要先获取这个对象session := sessions.Default(c)// 设置Sessionsession.Set("key", "Hello world")// 保存sessionsession.Save()// 获取sessionvalue := session.Get("key")c.JSON(200, gin.H{"message": "Session is: "+ value })})// 启动服务r.Run(":8080")
}