从一个error来认识gin-contrib / sessions。

在我们进行一些业务的时候,由于http是无状态的协议,我们需要session和cookie来保持用户的状态。在gin框架中,有一个很好的整合了session的库:gin-contrib / sessions。

更多样例可看github:

https://github.com/gin-contrib/sessions

在这里谈谈如何简单的使用这个库。
我一开始也不是很熟悉这个库,直接在代码中使用了存储。

func(a *AdminLoginController)AdminLogin(c *gin.Context){
	i := &dto.AdminLoginInput{}
	if err := i.Binding(c);err != nil{
		public.ResponseErrorWithMsg(public.CodeServeBusy,c,err.Error())
		return
	}
	err, db := sys_init.GetGormConn("default")
	if err != nil{
		public.ResponseError(public.CodeServeBusy,c)
		return
	}
	admin, err := service.AdminLogin(db, i)
	if err != nil{
		public.ResponseError(public.CodeUserNotExist,c)
		return
	}
	s := &AdminSession{
		Id:        admin.Id,
		Username:  admin.UserName,
		LoginTime: time.Now(),
	}
	sJson, err := json.Marshal(s)
	if err != nil{
		public.ResponseError(public.CodeInvalidAuth,c)
		return
	}
	//使用库,但是报错:Key "github.com/gin-gonic/contrib/sessions" does not exist
	session := sessions.Default(c)
	session.Set(public.AdminSessionInfoKet,string(sJson))
	session.Save()
	out := dto.AdminLoginOutput{Token: admin.UserName}
	public.ResponseSuccess(c,out)
}

结果报错:Key “github.com/gin-gonic/contrib/sessions” does not exist
通过debug,我发现是在Default这一步出错。下面进去Default看一下吧。
在这里插入图片描述
这个DefaultKey是什么?
在这里插入图片描述
不就是我们上面报的错嘛,似乎是因为gin框架在一开始初始化的时候,没有将这个key和对应的val,set到context中。
那我们得考虑,我们是不是应该use某个中间件,让Handler帮我们做这个事情。

再看下面这个方法。在这里插入图片描述
他正好返回了一个Handler,以一种中间件的形式,为我们set了这个session,以DefaultKey。
那么看看他的参数,他需要一个name,一个store。name好说,应该就是session存取的名字。我们来看看store。
在这里插入图片描述
支持cookie,redis等实现类。实际上我们想用什么存就用什么存只要实现了他的接口就好。在这里插入图片描述
现在所有问题都解决了。我们只要在注册gin的核心的时候带上这些代码即可。

	store, _ := sessions.NewRedisStore(10,"tcp","localhost:6379","abc123456"[]byte("secret"))
	engine := gin.New()
	engine.Use(sessions.session("mysession",store))

下面看看效果吧。
我们set了一个结构体,结构如下:

type AdminSession struct {
	Id 			int			`json:"id"`
	Username 	string		`json:"username"`
	LoginTime	time.Time	`json:"login_time"`
}

set的代码:

session := sessions.Default(c)
	session.Set(public.AdminSessionInfoKey,string(sJson))
	//不要忘记save
	session.Save()

对应在redis:
在这里插入图片描述

今天就分享到这里!希望和你们共同进步!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值