Session 会话:r.Session 基本用法与配置
引言
登录状态、购物车这类"跟着用户走"的数据,靠 Session 保存。GoFrame 的 gsession 组件提供服务端会话管理,Web 请求中通过 r.Session 直接使用。
概念
- 获取会话:HTTP 处理函数里通过请求对象拿:
r.Session。 - 基本操作:
Set(ctx, key, value)写入、Get(ctx, key)读取(返回*gvar.Var)、Remove(ctx, key)删除单个、整单清除等方法见官方文档 gsession 章节。 - 会话 ID:框架通过 Cookie 保存会话 ID(
r.Session.Id()可取),客户端带 Cookie 即恢复会话。 - 存储方式:支持内存、文件、Redis 等存储适配器,默认与切换方式见官方文档(Session-Memory/File/Redis 等页面)。
- 过期时间:会话过期时长属服务端配置(如
sessionMaxAge),服务重启后内存型会话会丢失,生产多实例推荐 Redis 存储。
代码示例
一个"登录后写入 Session、再次请求时读取"的最小示例:
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server()
s.Group("/", func(group *ghttp.RouterGroup) {
// 模拟登录:写入会话
group.POST("/login", func(r *ghttp.Request) {
ctx := r.Context()
uid := r.Get("uid", 0).Int()
if uid <= 0 {
r.Response.WriteJson(g.Map{"code": 1, "message": "uid 无效"})
return
}
err := r.Session.Set(ctx, "uid", uid)
if err != nil {
r.Response.WriteJson(g.Map{"code": 1, "message": err.Error()})
return
}
r.Response.WriteJson(g.Map{"code": 0, "message": "登录成功", "sessionId": r.Session.Id()})
})
// 读取会话中的登录态
group.GET("/profile", func(r *ghttp.Request) {
ctx := r.Context()
uid := r.Session.Get(ctx, "uid")
if uid.IsEmpty() {
r.Response.WriteJson(g.Map{"code": 401, "message": "未登录"})
return
}
r.Response.WriteJson(g.Map{"code": 0, "uid": uid.Int()})
})
// 退出登录:删除会话中的 uid
group.POST("/logout", func(r *ghttp.Request) {
ctx := r.Context()
_ = r.Session.Remove(ctx, "uid")
r.Response.WriteJson(g.Map{"code": 0, "message": "已退出"})
})
})
s.SetPort(8000)
s.Run()
}
测试流程:先 POST /login(带 uid=1),拿到会话 Cookie;再带 Cookie 访问 GET /profile 可读到 uid。
会话过期与相关配置可以在 config.yaml 的 server 节点设置:
server:
address: ":8000"
sessionMaxAge: "24h" # 会话最长存活时间(键名与单位以官方文档为准)
注意点
- Session 方法需要 ctx,别漏传;
Get返回*gvar.Var,用.IsEmpty()判断是否存在。 - 默认存储若为进程内实现,重启服务后会话全部失效;需要跨重启/多实例共享时切换到 Redis 等存储。
- 会话数据别塞大对象,Session 每次请求都要序列化/反序列化,只存 ID 等必要信息。
- 登录安全(密码、Token、Cookie 属性)与 Session 存储细节不在本章范围,生产实现前查阅官方文档。
小结
r.Session 的 Set/Get/Remove 覆盖了会话的日常操作;存储方式与过期策略决定了生产环境怎么配。gsession 的存储适配器、生命周期配置以官方文档 goframe.org 的 Session 章节为准。