在我们进行一些业务的时候,由于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:
今天就分享到这里!希望和你们共同进步!