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.yamlserver 节点设置:

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 章节为准。

笔记加载中…