Session模块用于存储客户端用户会话数据
Session模块只支持Cookie方式的请求,若客户端不支持Cookie则无法使用。
Session模块参考database/sql引擎写法,采用一个接口多个实现的方式。
Session模块目前实现的存储驱动包括memory、file、Redis、MySQL
模块
安装模块
$ go get github.com/beego/beego/v2/server/web/session
配置
Session会话配置位于conf/app.go应用配置文件中,默认会话处于关闭状态,默认会话引擎采用的是memory。
会话配置
默认值
描述
SessionOn
false
是否开启会话
SessionProvider
memory
会话引擎
SessionName
beegosessionID
保存在客户端的Cookie名称
SessionGCMaxLifetime
3600
会话过期时长,默认3600秒。
SessionCookieLifeTime
3600
保存在客户端Cookie过期时长,默认3600秒。
SessionAutoSetCookie
true
是否开启以客户端Cookie进行保存会话
SessionDomain
""
客户端Cookie存储域名
默认开启会话后,Beego会将服务端的会话数据保存在内存memory中。开启以客户端Cookie方式存储会话后,若浏览器关闭则会话数据会失效。
开启会话
$ vim conf/app.go
SessionOn = true
获取配置
默认可采用beego.BConfig.WebConfig.Session的方式获取或设置会话的配置选项
beego.BConfig.WebConfig.Session.SessionOn = false
beego.BConfig.WebConfig.Session.SessionProvider = "memory"
beego.BConfig.WebConfig.Session.SessionName = "beegosessionID"
beego.BConfig.WebConfig.Session.SessionGCMaxLifetime = 3600
beego.BConfig.WebConfig.Session.SessionCookieLifeTime = 3600
beego.BConfig.WebConfig.Session.SessionAutoSetCookie = true
beego.BConfig.WebConfig.Session.SessionDomain = ""
例如:使用文件方式存储会话
使用文件方式file存储会话时需定义会话保存路径,会话采用两级目录新建文件的方式根据SessionID来保存对应的Session文件。比如SessionID为015abf2467f55e1b1f799a683a2e0904,则会在sessionProviderConfig文件夹下创建0/1/015abf2467f55e1b1f799a683a2e0904文件来保存。
$ vim conf/app.go
sessionOn = true
sessionProvider = "file"
sessionProviderConfig = "./tmp/session"
导入
导入包
import "github.com/beego/beego/v2/server/web/session"
初始化
初始化全局变量用于存储会话控制器
操作
控制器模块中提供了便捷的方法来操作会话
// StartSession starts session and load old session data info this controller.
func (c *Controller) StartSession() session.Store {
if c.CruSession == nil {
c.CruSession = c.Ctx.Input.CruSession
}
return c.CruSession
}
// SetSession puts value into session.
func (c *Controller) SetSession(name interface{}, value interface{}) {
if c.CruSession == nil {
c.StartSession()
}
c.CruSession.Set(name, value)
}
// GetSession gets value from session.
func (c *Controller) GetSession(name interface{}) interface{} {
if c.CruSession == nil {
c.StartSession()
}
return c.CruSession.Get(name)
}
// DelSession removes value from session.
func (c *Controller) DelSession(name interface{}) {
if c.CruSession == nil {
c.StartSession()
}
c.CruSession.Delete(name)
}
// SessionRegenerateID regenerates session id for this session.
// the session data have no changes.
func (c *Controller) SessionRegenerateID() {
if c.CruSession != nil {
c.CruSession.SessionRelease(c.Ctx.ResponseWriter)
}
c.CruSession = GlobalSessions.SessionRegenerateID(c.Ctx.ResponseWriter, c.Ctx.Request)
c.Ctx.Input.CruSession = c.CruSession
}
// DestroySession cleans session data and session cookie.
func (c *Controller) DestroySession() {
c.Ctx.Input.CruSession.Flush()
c.Ctx.Input.CruSession = nil
GlobalSessions.SessionDestroy(c.Ctx.ResponseWriter, c.Ctx.Request)
}
使用GetSession()方法可获取会话中对应键的值
value := this.GetSession("key")
使用SetSession()方法可设置键值对到当前会话中
this.SetSession("key", value)
使用DelSession()方法可删除指定键的值,删除后值默认会为nil。
this.DelSession("key")