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

一位不愿意透露姓名的杨先生 · · 504 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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


有疑问加站长微信联系(非本文作者)

本文来自:掘金

感谢作者:一位不愿意透露姓名的杨先生

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

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

504 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传