使用gin封装一个web脚手架(五):实现session(上)

·  阅读 541
使用gin封装一个web脚手架(五):实现session(上)

上一篇中我们改装了中间件,现在可以根据中间件实现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

运行浏览器后

image.png cookie已经设置成功了

接下来将session初始化的数据存到redis中,在存redis之前,我们需要设计一下session的数据结构是怎么样的。首先,redis选用k-v结构,key是uuid生成的随机字符串。

value的结构先设计成这样,可以符合现阶段的需要

类型描述
cookieuuid浏览器的cookie值
expire_timeint过期时间,和当前string过期时间保持一致
session_listmap[string]interface{}session的各个值

在redis中的展示如下

image.png

分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改