一、什么是session
在web应用中往往需要使用session来记录用户状态,比如用户校验的权限信息,
session在网络应用中称为“会话控制”,是服务器为了保存用户状态而创建的一个特殊的对象。简而言之,session就是一个对象,用于存储信息。
例如打开网站时,我们并没有登录,但是我们任然可以发送任意请求,并且进行查看,当我们退出游览器后再打开游览器进行查看时,却不能自动登录,不能发送请求,这就是通过session来实现的。
session是存储于服务器端的特殊对象,服务器会为每一个游览器(客户端)创建一个唯一的session。这个session是服务器端共享,每个游览器(客户端)独享的。我们可以在session存储数据,实现数据共享。
二、golang中的session
但是golang基础库没有session实现,所以需要使用第三方session库,
goweb框架大都有自己的实现,
比如gin的github.com/gin-contrib/sessions,
iris的github.com/kataras/iris/sessions
三、本文介绍gin的session库
首先需要下载导入session库
go get github.com/gin-contrib/sessions
初始化session以及session的存储方式(以cookie为例),并通过r.use来加载,如下方示例
func main() {
r := gin.Default()
store := cookie.NewStore([]byte("secret"))
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")
session.Save()
}
c.JSON(200, gin.H{"hello": session.Get("hello")})
})
r.Run(":8000")
}
存取session通过提供的get和set方法来完成
// 取值
value := session.Get(key)
// 存值
session.Set(key, value)
session.Save()
session可以有不同的存储方法 之前的示例中,基于cookie来存储session
store := cookie.NewStore([]byte("secret"))
r.Use(sessions.Sessions("mysession", store))
我们也可以基于redis来存储session
r := gin.Default()
store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret"))
r.Use(sessions.Sessions("mysession", store))
kv值的存取操作还是一样的
由于session是存放于服务器的,当有很多客户端访问时,肯定会产生大量的session,这些session会对服务端的性能造成影响。
除此以外还可以存储在数据库中,但是这种操作使用频率低,大家自行选取合适的方法。