代码 package main
import (
"encoding/gob"
"net/http"
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
"github.com/gin-gonic/gin"
)
type LoginUser struct {
Id string
Name string
Age int
}
func main() {
// 注册LoginUser结构体,使其可以跨路由存取
gob.Register(LoginUser{})
engine := gin.Default()
// 添加session中间件
store := cookie.NewStore([]byte("secret"))
engine.Use(sessions.Sessions("mysession", store))
engine.GET("login", loginHandler)
engine.GET("info", infoHandler)
engine.Run(":9008")
}
// 获取用户信息
func infoHandler(c *gin.Context) {
// 判断参数
name := c.Query("name")
if len(name) == 0 {
c.JSON(http.StatusBadRequest, "参数错误")
return
}
// 创建session
session := sessions.Default(c)
// 定义session的key
sessionKey := "session_" + name
// 获取session的value
sessionValue := session.Get(sessionKey)
// 判断value
if sessionValue != nil {
c.JSON(http.StatusOK, gin.H{"info": sessionValue})
c.String(http.StatusOK, session.Get("aabbcc").(string))
} else {
c.JSON(http.StatusOK, "登陆过期或未登录")
}
return
}
// 用户登陆
func loginHandler(c *gin.Context) {
// 判断参数
name := c.Query("name")
if len(name) == 0 {
c.JSON(http.StatusBadRequest, "参数错误")
return
}
// 创建session
session := sessions.Default(c)
// 定义session的key
sessionKey := "session_" + name
// 获取session的value 并判断: sessionValue!=nil 则返回会话信息 sessionValue==nil 则创建并保存会话
sessionValue := session.Get(sessionKey)
if sessionValue != nil {
c.JSON(http.StatusOK, gin.H{"info": sessionValue, "msg": "重复登陆"})
return
}
// 创建loginUser并保存
loginUser := LoginUser{Id: "123", Name: name, Age: 30}
session.Set("aabbcc", "aabbcc123456") // 单独测试保存string类型
session.Set(sessionKey, loginUser)
// 设置session的参数
options := sessions.Options{}
options.Path = "/"
options.MaxAge = 10 // 有效期10秒
session.Options(options)
// 保存session
session.Save()
c.JSON(http.StatusOK, gin.H{"info": loginUser, "msg": "登陆成功"})
return
}