GoFrame框架提供了完善的Session管理能力,由gsession组件实现。由于Session机制在HTTP服务中最常用,因此后续章节中将着重以HTTP服务为示例介绍Session的使用。

基本介绍

接口文档:https://pkg.go.dev/github.com/gogf/gf/v2/os/gsession

任何时候都可以通过ghttp.Request获取Session对象,因为CookieSession都是和请求会话相关,因此都属于Request的成员对象,并对外公开。GoFrame框架的Session默认过期时间是24小时

SessionId默认通过Cookie来传递,并且也支持客户端通过Header传递SessionIdSessionId的识别名称可以通过ghttp.ServerSetSessionIdName进行修改。Session的操作是支持并发安全的,这也是框架在对Session的设计上不采用直接以map的形式操作数据的原因。在HTTP请求流程中,我们可以通过ghttp.Request对象来获取Session对象,并执行相应的数据操作。

此外,ghttp.Server中的SessionId使用的是客户端的 RemoteAddr + Header 请求信息通过guid模块来生成的,保证随机及唯一性:https://github.com/gogf/gf/blob/master/net/ghttp/ghttp_request.go

gsession模块

Session的管理功能由独立的gsession模块实现,并已完美整合到了ghttp.Server中。由于该模块是解耦独立的,因此可以应用到更多不同的场景中,例如:TCP通信、gRPC接口服务等等。在gsession模块中有比较重要的三个对象/接口:

  1. gsession.Manager:管理Session对象、Storage持久化存储对象、以及过期时间控制。
  2. gsession.Session:单个Session会话管理对象,用于Session参数的增删查改等数据管理操作。
  3. gsession.Storage:这是一个接口定义,用于Session对象的持久化存储、数据写入/读取、存活更新等操作,开发者可基于该接口实现自定义的持久化存储特性。 该接口定义详见:https://github.com/gogf/gf/blob/master/os/gsession/gsession_storage.go

存储实现方式

gsession实现并为开发者提供了常见的四种Session存储实现方式:

Storage支持分布式支持持久化内存占用执行效率简要介绍

StorageFile

基于文件存储(默认)。单节点部署方式下比较高效的持久化存储方式:Session-File

StorageMemory

基于纯内存存储。单节点部署,性能最高效,但是无法持久化保存,重启即丢失:Session-Memory

StorageRedis

基于Redis存储(Key-Value)。远程Redis节点存储Session数据,支持应用多节点部署:Session-Redis-KeyValue

StorageRedisHashTable

基于Redis存储(HashTable)。远程Redis节点存储Session数据,支持应用多节点部署:Session-Redis-HashTable

四种方式各有优劣,详细介绍请查看对应章节。

Session的初始化

以常见的HTTP请求为例。ghttp.Request中的Session对象采用了"懒初始化(LazyInitialization)"设计方式,默认在Request中有一个Session属性对象,但是并未初始化(一个空对象),只有在使用Session属性对象的方法时才会真正执行初始化。这样的设计既保障了未使用Session特性的请求执行性能,也保证了组件使用的易用性。

Session的销毁/注销

用户Session不再使用,例如用户注销登录状态,需要从存储中硬删除,那么可以调用RemoveAll方法。



Content Menu

  • No labels

2 Comments

  1. 请问有没有一个简洁的方法让管理员使一个用户的session失效?

  2. 请问有办法直接通过session id 获取到session的数据吗, 比如用于限制登录设备数? 每次登录都保存session id到数据库数组, 然后通过session id 获取该用户下的所有不同设备的session进行修改

    context好像只能获取当前用户的session