Session
beego
内置了 session
模块,目前 session
模块支持的后端引擎包括 memory
、cookie
、file
、mysql
、redis
、couchbase
、memcache
、postgres
,用户也可以根据相应的接口实现自己的引擎。
在 Web 中使用 Session
在 web
模块中使用 session
相当方便,只要在 main
入口函数中设置如下:
web.BConfig.WebConfig.Session.SessionOn = true
或者通过配置文件配置如下:
sessionon = true
通过这种方式就可以开启 session
,如何使用 session
,请看下面的例子:
func (this *MainController) Get() {
v := this.GetSession("asta")
if v == nil {
this.SetSession("asta", int(1))
this.Data["num"] = 0
} else {
this.SetSession("asta", v.(int)+1)
this.Data["num"] = v.(int)
}
this.TplName = "index.tpl"
}
session
有几个方便的方法:
SetSession(name string, value interface{})
GetSession(name string) interface{}
DelSession(name string)
SessionRegenerateID()
DestroySession()
session
操作主要有设置 session
、获取 session
,删除 session
。
当然你可以通过下面的方式自己控制这些逻辑:
sess:=this.StartSession()
defer sess.SessionRelease()
sess
对象具有如下方法:
sess.Set()
sess.Get()
sess.Delete()
sess.SessionID()
sess.Flush()
但是我还是建议大家采用 SetSession、GetSession、DelSession
三个方法来操作,避免自己在操作的过程中资源没释放的问题。
关于 Session
模块使用中的一些参数设置:
web.BConfig.WebConfig.Session.SessionOn
: 设置是否开启Session
,默认是false
,配置文件对应的参数名:sessionon
。web.BConfig.WebConfig.Session.SessionProvider
: 设置Session
的引擎,默认是memory
,目前支持还有file
、mysql
、redis
等,配置文件对应的参数名:sessionprovider
。web.BConfig.WebConfig.Session.SessionName
: 设置cookies
的名字,Session
默认是保存在用户的浏览器cookies
里面的,默认名是beegosessionID
,配置文件对应的参数名是:sessionname
。web.BConfig.WebConfig.Session.SessionGCMaxLifetime
: 设置Session
过期的时间,默认值是3600
秒,配置文件对应的参数:sessiongcmaxlifetime
。web.BConfig.WebConfig.Session.SessionProviderConfig
: 设置对应file
、mysql
、redis
引擎的保存路径或者链接地址,默认值是空,配置文件对应的参数:sessionproviderconfig
。web.BConfig.WebConfig.Session.SessionHashFunc
: 默认值为sha1
,采用sha1
加密算法生产sessionid
web.BConfig.WebConfig.Session.SessionCookieLifeTime
: 设置cookie
的过期时间,cookie
是用来存储保存在客户端的数据。
在使用某种特定引擎的时候,需要匿名引入该引擎对应的包,以完成初始化工作:
import _ "github.com/beego/beego/v2/server/web/session/mysql"
不同引擎的初始化工作
File
当 SessionProvider
为 file
SessionProviderConfig
是指保存文件的目录,如下所示:
web.BConfig.WebConfig.Session.SessionProvider="file"
web.BConfig.WebConfig.Session.SessionProviderConfig = "./tmp"
MySQL
当 SessionProvider
为 mysql
时,SessionProviderConfig
是链接地址,采用 go-sql-driver,如下所示:
web.BConfig.WebConfig.Session.SessionProvider = "mysql"
web.BConfig.WebConfig.Session.SessionProviderConfig = "username:password@protocol(address)/dbname?param=value"
需要特别注意的是,在使用 mysql
存储 session
信息的时候,需要事先在 mysql
创建表,建表语句如下
CREATE TABLE `session` (
`session_key` char(64) NOT NULL,
`session_data` blob,
`session_expiry` int(11) unsigned NOT NULL,
PRIMARY KEY (`session_key`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Redis
当 SessionProvider
为 redis
时,SessionProviderConfig
是 redis
的链接地址,采用了 redigo,如下所示:
web.BConfig.WebConfig.Session.SessionProvider = "redis"
web.BConfig.WebConfig.Session.SessionProviderConfig = "127.0.0.1:6379"
memcache
当 SessionProvider
为 memcache
时,SessionProviderConfig
是 memcache
的链接地址,采用了 memcache,如下所示:
web.BConfig.WebConfig.Session.SessionProvider = "memcache"
web.BConfig.WebConfig.Session.SessionProviderConfig = "127.0.0.1:7080"
Postgress
当 SessionProvider
为 postgres
时,SessionProviderConfig
是 postgres
的链接地址,采用了 postgres,如下所示:
web.BConfig.WebConfig.Session.SessionProvider = "postgresql"
web.BConfig.WebConfig.Session.SessionProviderConfig = "postgres://pqgotest:password@localhost/pqgotest?sslmode=verify-full"
Couchbase
当 SessionProvider
为 couchbase
时,SessionProviderConfig
是 couchbase
的链接地址,采用了 couchbase,如下所示:
web.BConfig.WebConfig.Session.SessionProvider = "couchbase"
web.BConfig.WebConfig.Session.SessionProviderConfig = "http://bucketname:bucketpass@myserver:8091"
特别注意点
因为 session
内部采用了 gob
来注册存储的对象,例如 struct
,所以如果你采用了非 memory
的引擎,请自己在 main.go
的 init
里面注册需要保存的这些结构体,不然会引起应用重启之后出现无法解析的错误
单独使用 Session 模块
如果不想使用 beego
的 web
模块,但是想使用 beego
的 session
模块,也是可以的
首先你必须导入包:
import (
"github.com/beego/beego/v2/server/web/session"
)
然后你初始化一个全局的变量用来存储 session
控制器:
var globalSessions *session.Manager
接着在你的入口函数中初始化数据:
func init() {
sessionConfig := &session.ManagerConfig{
CookieName:"gosessionid",
EnableSetCookie: true,
Gclifetime:3600,
Maxlifetime: 3600,
Secure: false,
CookieLifeTime: 3600,
ProviderConfig: "./tmp",
}
globalSessions, _ = session.NewManager("memory",sessionConfig)
go globalSessions.GC()
}
NewManager
函数的参数的函数如下所示
- 引擎名字,可以是
memory
、file
、MySQL
或Redis
。 - 一个
JSON
字符串,传入Manager
的配置信息cookieName
: 客户端存储cookie
的名字。enableSetCookie
,omitempty
: 是否开启SetCookie
,omitempty
这个设置gclifetime
: 触发GC
的时间。maxLifetime
: 服务器端存储的数据的过期时间secure
: 是否开启HTTPS
,在cookie
中设置cookie.Secure
。sessionIDHashFunc
:sessionID
生产的函数,默认是sha1
算法。sessionIDHashKey
:hash
算法中的key
。cookieLifeTime
: 客户端存储的cookie
的时间,默认值是0
,即浏览器生命周期。providerConfig
: 配置信息,根据不同的引擎设置不同的配置信息,详细的配置请看下面的引擎设置
最后我们的业务逻辑处理函数中可以这样调用:
func login(w http.ResponseWriter, r *http.Request) {
sess, _ := globalSessions.SessionStart(w, r)
defer sess.SessionRelease(w)
username := sess.Get("username")
if r.Method == "GET" {
t, _ := template.ParseFiles("login.gtpl")
t.Execute(w, nil)
} else {
sess.Set("username", r.Form["username"])
}
}
globalSessions
有多个函数如下所示:
SessionStart
根据当前请求返回session
对象SessionDestroy
销毁当前session
对象SessionRegenerateId
重新生成sessionID
GetActiveSession
获取当前活跃的session
用户SetHashFunc
设置sessionID
生成的函数SetSecure
设置是否开启cookie
的Secure
设置
返回的 session
对象是一个 Interface
,包含下面的方法
- Set(key, value interface{}) error
- Get(key interface{}) interface{}
- Delete(key interface{}) error
- SessionID() string
- SessionRelease()
- Flush() error
引擎设置
上面已经展示了 memory
的设置,接下来我们看一下其他三种引擎的设置方式:
mysql
: 其他参数一样,只是第四个参数配置设置如下所示,详细的配置请参考 mysql:username:password@protocol(address)/dbname?param=value
Redis
: 配置文件信息如下所示,表示链接的地址,连接池,访问密码,没有保持为空:注意:若使用 Redis 等引擎作为 session backend,请在使用前导入 < _ “github.com/beego/beego/v2/server/web/session/redis” >
否则会在运行时发生错误,使用其他引擎时也是同理。
127.0.0.1:6379,100,astaxie
file
: 配置文件如下所示,表示需要保存的目录,默认是两级目录新建文件,例如sessionID
是xsnkjklkjjkh27hjh78908
,那么目录文件应该是./tmp/x/s/xsnkjklkjjkh27hjh78908
:./tmp
如何创建自己的引擎
在开发应用中,你可能需要实现自己的 session
引擎,例如 memcache
的引擎。
// Store contains all data for one session process with specific id.
type Store interface {
Set(ctx context.Context, key, value interface{}) error //set session value
Get(ctx context.Context, key interface{}) interface{} //get session value
Delete(ctx context.Context, key interface{}) error //delete session value
SessionID(ctx context.Context) string //back current sessionID
SessionRelease(ctx context.Context, w http.ResponseWriter) // release the resource & save data to provider & return the data
Flush(ctx context.Context) error //delete all data
}
// Provider contains global session methods and saved SessionStores.
// it can operate a SessionStore by its id.
type Provider interface {
SessionInit(ctx context.Context, gclifetime int64, config string) error
SessionRead(ctx context.Context, sid string) (Store, error)
SessionExist(ctx context.Context, sid string) (bool, error)
SessionRegenerate(ctx context.Context, oldsid, sid string) (Store, error)
SessionDestroy(ctx context.Context, sid string) error
SessionAll(ctx context.Context) int // get all active session
SessionGC(ctx context.Context)
}
最后需要注册自己写的引擎:
func init() {
Register("own", ownadaper)
}