Gin中的Session

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

gin-contrib/sessions 中间件支持的存储引擎:
cookie
memstore
redis
memcached
mongodb

4 基于Cookie存储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的存储引擎 secret是用于加密的密钥可以随意更改
  store := cookie.NewStore([]byte("secret"))
  // 配置中间件 store 是前面创建的存储引擎,我们可以替换成其他存储引擎
  // mysession 是客户端中cookie的key 可以更改
  r.Use(sessions.Sessions("mysession", store))

  r.GET("/incr", func(c *gin.Context) {
    // 获取一个session对象 传入c
    session := sessions.Default(c)
    var count int
    // 获取session
    v := session.Get("count")
    if v == nil {
      count = 0
    } else {
      count = v.(int)
      count++
    }
    // 设置session
    session.Set("count", count)
    // 必须调用 才能保存
    session.Save()
    c.JSON(200, gin.H{"count": count})
  })
  r.Run(":8000")
}

5 基于redis实现分布式Session (只需要改变一下存储引擎,改为redis)

package main

import (
  "github.com/gin-contrib/sessions"       // 引入
  "github.com/gin-contrib/sessions/redis" // 引入
  "github.com/gin-gonic/gin"
)

func main() {
  r := gin.Default()
  // 创建一个基于redis的存储引擎 secret是用于加密的密钥可以随意更改
  store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret"))
  // 配置中间件 store 是前面创建的存储引擎,我们可以替换成其他存储引擎
  // mysession 是客户端中cookie的key 可以更改
  r.Use(sessions.Sessions("mysession", store))

  r.GET("/incr", func(c *gin.Context) {
    // 获取一个session对象 传入c
    session := sessions.Default(c)
    var count int
    v := session.Get("count")
    if v == nil {
      count = 0
    } else {
      count = v.(int)
      count++
    }
    session.Set("count", count)
    session.Save()
    c.JSON(200, gin.H{"count": count})
  })
  r.Run(":8000")
}

/*
	store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret"))
	
	第一个参数 size 连接数
	第二个参数 network 网络
	第三个参数 address 地址
	第四个参数 password 密码
	第五个参数 keyPairs 用于加密的密钥

*/

6 设置Session的过期时间

package main

import (
  "github.com/gin-contrib/sessions"       // 引入
  "github.com/gin-contrib/sessions/redis" // 引入
  "github.com/gin-gonic/gin"
)

func main() {
  r := gin.Default()
  // 创建一个基于redis的存储引擎 secret是用于加密的密钥可以随意更改
  store, _ := redis.NewStore(10, "tcp", "localhost:6379", "", []byte("secret"))
  // 配置中间件 store 是前面创建的存储引擎,我们可以替换成其他存储引擎
  // mysession 是客户端中cookie的key 可以更改
  r.Use(sessions.Sessions("mysession", store))

  r.GET("/incr", func(c *gin.Context) {
    // 获取一个session对象 传入c
    session := sessions.Default(c)
    // 配置过期时间
    session.Options(session.Options{
        MaxAge : 3600 * 6 // 6小时 单位是秒 默认是30天      
    })
      
    var count int
    v := session.Get("count")
    if v == nil {
      count = 0
    } else {
      count = v.(int)
      count++
    }
    session.Set("count", count)
    session.Save()
    c.JSON(200, gin.H{"count": count})
  })
  r.Run(":8000")
}

posted @ 2024-01-17 11:03  春游去动物园  阅读(124)  评论(0编辑  收藏  举报