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

接口文档

https://godoc.org/github.com/gogf/gf/os/gsession

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

SessionId默认通过Cookie来传递,并且也支持客户端通过Header传递SessionIdSessionId的识别名称可以通过ghttp.ServerSetSessionIdName进行修改。

此外,需要说明的是,Session的操作是支持并发安全的,这也是框架在对Session的设计上不采用直接以map的形式操作数据的原因。在HTTP请求流程中,我们可以通过ghttp.Request对象来获取Session对象,并执行相应的数据操作。

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

    1. type Storage interface {
    2. // New creates a custom session id.
    3. // This function can be used for custom session creation.
    4. New(ttl time.Duration) (id string)
    5. // Get retrieves session value with given key.
    6. // It returns nil if the key does not exist in the session.
    7. Get(id string, key string) interface{}
    8. // GetMap retrieves all key-value pairs as map from storage.
    9. GetMap(id string) map[string]interface{}
    10. // GetSize retrieves the size of key-value pairs from storage.
    11. GetSize(id string) int
    12. // Set sets key-value session pair to the storage.
    13. // The parameter <ttl> specifies the TTL for the session id (not for the key-value pair).
    14. Set(id string, key string, value interface{}, ttl time.Duration) error
    15. // SetMap batch sets key-value session pairs with map to the storage.
    16. // The parameter <ttl> specifies the TTL for the session id(not for the key-value pair).
    17. SetMap(id string, data map[string]interface{}, ttl time.Duration) error
    18. // Remove deletes key with its value from storage.
    19. Remove(id string, key string) error
    20. // RemoveAll deletes all key-value pairs from storage.
    21. RemoveAll(id string) error
    22. // GetSession returns the session data as *gmap.StrAnyMap for given session id from storage.
    23. //
    24. // The parameter <ttl> specifies the TTL for this session, and it returns nil if the TTL is exceeded.
    25. // The parameter <data> is the current old session data stored in memory,
    26. // and for some storage it might be nil if memory storage is disabled.
    27. //
    28. // This function is called ever when session starts.
    29. GetSession(id string, ttl time.Duration, data *gmap.StrAnyMap) (*gmap.StrAnyMap, error)
    30. // SetSession updates the data for specified session id.
    31. // This function is called ever after session, which is changed dirty, is closed.
    32. // This copy all session data map from memory to storage.
    33. SetSession(id string, data *gmap.StrAnyMap, ttl time.Duration) error
    34. // UpdateTTL updates the TTL for specified session id.
    35. // This function is called ever after session, which is not dirty, is closed.
    36. UpdateTTL(id string, ttl time.Duration) error
    37. }

存储实现方式

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

  1. 基于文件存储(默认):单节点部署方式下比较高效的持久化存储方式;
  2. 基于纯内存存储:性能最高效,但是无法持久化保存,重启即丢失;
  3. 基于Redis存储:远程Redis节点存储Session数据,支持应用多节点部署;

三种方式各有优劣,详细介绍请查看后续章节。