GoFrame
框架提供了完善的Session
管理能力,由gsession
组件实现。由于Session
机制在HTTP
服务中最常用,因此后续章节中将着重以HTTP
服务为示例介绍Session
的使用。
接口文档:https://pkg.go.dev/github.com/gogf/gf/v2/os/gsession
任何时候都可以通过ghttp.Request
获取Session
对象,因为Cookie
和Session
都是和请求会话相关,因此都属于Request
的成员对象,并对外公开。GoFrame
框架的Session
默认过期时间是24小时。
SessionId
默认通过Cookie
来传递,并且也支持客户端通过Header
传递SessionId
,SessionId
的识别名称可以通过ghttp.Server
的SetSessionIdName
进行修改。Session
的操作是支持并发安全的,这也是框架在对Session
的设计上不采用直接以map
的形式操作数据的原因。在HTTP
请求流程中,我们可以通过ghttp.Request
对象来获取Session
对象,并执行相应的数据操作。
此外,ghttp.Server
中的SessionId
使用的是客户端的 RemoteAddr + Header
请求信息通过guid
模块来生成的,保证随机及唯一性:https://github.com/gogf/gf/v2/blob/master/net/ghttp/ghttp_request.go
需要注意的是,ghttp.Request
中的Session
对象采用了"懒初始化(LazyInitialization
)"设计方式,默认在Request
中有一个Session
属性对象,但是并未初始化(一个空对象),只有在使用Session
属性对象的方法时才会真正执行初始化。这样的设计既保障了未使用Session
特性的请求执行性能,也保证了组件使用的易用性。
Session
的管理功能由独立的gsession
模块实现,并已完美整合到了ghttp.Server
中。由于该模块是解耦独立的,因此可以应用到更多不同的场景中,例如:TCP
通信、gRPC
接口服务等等。在gsession
模块中有比较重要的三个对象/接口:
gsession.Manager
:管理Session
对象、Storage
持久化存储对象、以及过期时间控制。
gsession.Session
:单个Session
会话管理对象,用于Session
参数的增删查改等数据管理操作。
gsession.Storage
:这是一个接口定义,用于Session
对象的持久化存储、数据写入/读取、存活更新等操作,开发者可基于该接口实现自定义的持久化存储特性。 该接口定义详见:https://github.com/gogf/gf/v2/blob/master/os/gsession/gsession_storage.gogsession
实现并为开发者提供了常见的四种Session
存储实现方式:
Session-File
Session-Memory
Redis
存储(Key-Value
)。远程Redis
节点存储Session
数据,支持应用多节点部署:Session-Redis-KeyValue
Redis
存储(HashTable
)。远程Redis
节点存储Session
数据,支持应用多节点部署:Session-Redis-HashTable
四种方式各有优劣,详细介绍请查看对应章节。
有时,我们并不需要在路径操作函数中使用依赖项的返回值。或者说,有些依赖项不返回值。但仍要执行或解析该依赖项。对于这种情况...
Flask 中的蓝图为这些情况设计:把一个应用分解为一个蓝图的集合。这对大型应用是理想的。一个项目可以实例化 一个应用对象,初始...
像常规的应用一样,蓝图被设想为包含在一个文件夹中。当多个蓝图源于同一个文件 夹时,可以不必考虑上述情况,但也这通常不是推...
与 HttpResponse 不同,StreamingHttpResponse 没有 content 属性。因此,中间件不能再假设所有响应有 content ...
处理表单是一件挺复杂的事情。想想看Django的admin,许多不同类型的数据可能需要在一张表单中准备显示,渲染成HTML,使用方便的...