这篇文章我们讲讲gin中如何使用session
session 从字面上讲,就是会话。这个就类似于你和一个人交谈,你怎么知道你是和谁说话呢?session 也是类似的道理,服务器要知道当前发请求给自己的是谁。为了做这种区分,服务器就要给每个客户端分配不同的“身份标识”,然后客户端每次向服务器发请求的时候,都带上这个“身份标识”,服务器就知道这个请求来自于谁了。至于客户端怎么保存这个“身份标识”,可以有很多种方式,对于浏览器客户端,大家都默认采用 cookie 的方式。服务器使用session把用户的信息临时保存在了服务器上,用户离开网站后session会被销毁。这种用户信息存储方式相对cookie来说更安全,可是session有一个缺陷:如果web服务器做了负载均衡,那么下一个操作请求到了另一台服务器的时候session会丢失。这个时候我们可以采用session共享的方式存取session,例如我们把session放在redis、mysql、mongodb,当然这是后话,我们暂且不讨论。那么,在gin中是如何使用session的呢?
在gin中我们推荐一个类库github地址如下:
https://github.com/gin-contrib/sessions
1、存取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()
store := cookie.NewStore([]byte("secret"))
//路由上加入session中间件
r.Use(sessions.Sessions("mysession", store))
r.GET("/hello", func(c *gin.Context) {
session := sessions.Default(c)
if session.Get("hello") != "world" {
session.Set("hello", "world")
//记着调用save方法,写入session
session.Save()
}
c.JSON(200, gin.H{"hello": session.Get("hello")})
})
r.Run(":8080")
}
但是这种方法没有办法跨路由存取复杂结构的session数据,例如struct,那么我们怎么才可以跨路由存取session的呢?
2、跨路由存取复杂结构的session
package main
import (
"encoding/gob"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
"net/http"
)
type user struct {
Name string
Age int
}
func main() {
//把user这个接头体注册进来,后面跨路由才可以获取到user数据
gob.Register(user{})
r := gin.Default()
store := cookie.NewStore([]byte("secret"))
//路由上加入session中间件
r.Use(sessions.Sessions("mysession", store))
r.GET("/hello", func(c *gin.Context) {
session := sessions.Default(c)
if session.Get("hello") != "world" {
session.Set("hello", "world")
//记着调用save方法,写入session
session.Save()
}
//把结构体存入session中
session.Set("user", user{"hanyun", 30})
session.Save()
c.JSON(200, gin.H{"hello": session.Get("hello")})
})
r.GET("/user", func(c *gin.Context) {
session := sessions.Default(c)
user := session.Get("user")
c.JSON(http.StatusOK, gin.H{"user": user})
})
r.Run(":8080")
}
想要跨路由存取复杂结构的session,我们首先要把数据类型注册进来,小伙伴们一定不要忘记注册进来。
gob.Register(user{})
这个类库可以把session放在cookie、redis、memcached、MongoDB、memstore中,具体方法可以查看github地址https://github.com/gin-contrib/sessions
记着关注我哦