gin中的session库 | 青训营

156 阅读2分钟

一、什么是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会对服务端的性能造成影响。

除此以外还可以存储在数据库中,但是这种操作使用频率低,大家自行选取合适的方法。