上一篇中我们改装了中间件,现在可以根据中间件实现session功能了。实现之前要先创建一个redis连接,因为我们的session数据是存放在redis里面的
这里使用go-redis拓展包
go get github.com/go-redis/redis/v8
复制代码
在项目中创建redis文件夹并创建redis.go
package redis
import (
"context"
"github.com/go-redis/redis/v8"
"sync"
"time"
)
type connect struct {
client *redis.Client
}
var once = sync.Once{}
var _connect *connect
func connectRedis() {
cxt, cancel := context.WithTimeout(context.Background(), 1*time.Second)
defer cancel()
conf := &redis.Options{
Addr: "127.0.0.1:6379",
DB: 0,
}
c := redis.NewClient(conf)
re := c.Ping(cxt)
if re.Err() != nil {
panic(re.Err())
}
_connect = &connect{
client: c,
}
}
func Client() *redis.Client {
if _connect == nil {
once.Do(func() {
connectRedis()
})
}
return _connect.client
}
复制代码
这里用常规的单例拿到一个redis的连接对象
接下来修改一下路由,用根路径来做测试
package routes
//routes/routes.go
import (
"github.com/gin-gonic/gin"
"myGin/controller"
"myGin/kernel"
)
func config(router group) {
router.Registered(GET, "/", controller.Index)
}
func Load(r *gin.Engine) {
router := newRouter(r)
router.Group("", func(g group) {
config(g)
}, kernel.Middleware...) //加载全局中间件
}
复制代码
新建一个session中间件,用来设置session的key
package session
//middleware/session/session.go
import (
"fmt"
"myGin/context"
)
func Session(c *context.Context) {
}
复制代码
将这个中间件添加到全局中间件中
package kernel
//middleware/session/session.go
import (
"myGin/context"
"myGin/middleware/exception"
"myGin/middleware/session"
)
// Middleware 全局中间件
var Middleware []context.HandlerFunc
func Load() {
Middleware = []context.HandlerFunc{
exception.Exception,
session.Session,
}
}
复制代码
实现session的第一步是给浏览器设置一个cookie用做session的key,修改一下session.go
package session
import (
uuid "github.com/satori/go.uuid"
"myGin/context"
)
var cookieName = "my_gin"
func Session(c *context.Context) {
sessionKey := uuid.NewV4().String()
c.SetCookie(cookieName, sessionKey, 3600, "/", c.Domain(), false, true)
}
复制代码
这里用了一个uuid的包,安装请用:go get github.com/satori/go.uuid
运行浏览器后
cookie已经设置成功了
接下来将session初始化的数据存到redis中,在存redis之前,我们需要设计一下session的数据结构是怎么样的。首先,redis选用k-v结构,key是uuid生成的随机字符串。
value的结构先设计成这样,可以符合现阶段的需要
键 | 类型 | 描述 |
---|---|---|
cookie | uuid | 浏览器的cookie值 |
expire_time | int | 过期时间,和当前string过期时间保持一致 |
session_list | map[string]interface{} | session的各个值 |
在redis中的展示如下
有疑问加站长微信联系(非本文作者)