session是一個獨立的模塊,即你能夠那這個模塊應用於其它Go程序中。mysql
session模塊是用來存儲客戶端用戶,session目前只支持cookie方式的請求,若是客戶端不支持cookie,那麼就沒法使用該模塊。git
session模塊參考了database/sql的引擎寫法,採用了一個接口,多個實現的方式。github
目前實現了memory、file、Redis和MySQL四種存儲引擎。redis
經過下面的方式安裝session:算法
go get github.com/astaxie/beego/session
首先你必須導入包:sql
import ( "github.com/astaxie/beego/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函數的參數的函數以下所示:cookie
(1)引擎名字,能夠是 memory、file、mysql 或 redis。session
(2)一個 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 有多個函數以下所示:
返回的 session 對象是一個 Interface,包含下面的方法
上面已經展現了 memory 的設置,接下來咱們看一下其餘三種引擎的設置方式:
其餘參數同樣,只是第四個參數配置設置以下所示:
username:password@protocol(address)/dbname?param=value
配置文件信息以下所示,表示連接的地址,鏈接池,訪問密碼,沒有保持爲空:
注意:若使用redis等引擎做爲session backend,請在使用前導入 < _ 「github.com/astaxie/beego/session/redis」 >
配置文件以下所示,表示須要保存的目錄,默認是兩級目錄新建文件,例如 sessionID 是 xsnkjklkjjkh27hjh78908
,那麼目錄文件應該是 ./tmp/x/s/xsnkjklkjjkh27hjh78908
:
./tmp
在開發應用中,你可能須要實現本身的 session 引擎,beego 的這個 session 模塊設計的時候就是採用了 interface,因此你能夠根據接口實現任意的引擎,例如 memcache 的引擎。
type SessionStore interface { Set(key, value interface{}) error //set session value Get(key interface{}) interface{} //get session value Delete(key interface{}) error //delete session value SessionID() string //back current sessionID SessionRelease() // release the resource & save data to provider Flush() error //delete all data } type Provider interface { SessionInit(maxlifetime int64, savePath string) error SessionRead(sid string) (SessionStore, error) SessionExist(sid string) bool SessionRegenerate(oldsid, sid string) (SessionStore, error) SessionDestroy(sid string) error SessionAll() int //get all active session SessionGC() }
最後須要註冊本身寫的引擎:
func init() { Register("own", ownadaper) }