ec55edfbc4
Adding option for frequency of checking timed out connections as well as an option to specify retries. These changes make redis provider more stable since connection problems are becoming fewer. Since redigo does not have this options and since redis_sentinel and redis_cluster are using go-redis as a client, this commit changes from redigo to go-redis for redis session provider. Added tests for redis session provider as well. |
||
---|---|---|
.. | ||
couchbase | ||
ledis | ||
memcache | ||
mysql | ||
postgres | ||
redis | ||
redis_cluster | ||
redis_sentinel | ||
ssdb | ||
README.md | ||
sess_cookie_test.go | ||
sess_cookie.go | ||
sess_file_test.go | ||
sess_file.go | ||
sess_mem_test.go | ||
sess_mem.go | ||
sess_test.go | ||
sess_utils.go | ||
session.go |
session
session is a Go session manager. It can use many session providers. Just like the database/sql
and database/sql/driver
.
How to install?
go get github.com/astaxie/beego/session
What providers are supported?
As of now this session manager support memory, file, Redis and MySQL.
How to use it?
First you must import it
import (
"github.com/astaxie/beego/session"
)
Then in you web app init the global session manager
var globalSessions *session.Manager
-
Use memory as provider:
func init() { globalSessions, _ = session.NewManager("memory", `{"cookieName":"gosessionid","gclifetime":3600}`) go globalSessions.GC() }
-
Use file as provider, the last param is the path where you want file to be stored:
func init() { globalSessions, _ = session.NewManager("file",`{"cookieName":"gosessionid","gclifetime":3600,"ProviderConfig":"./tmp"}`) go globalSessions.GC() }
-
Use Redis as provider, the last param is the Redis conn address,poolsize,password:
func init() { globalSessions, _ = session.NewManager("redis", `{"cookieName":"gosessionid","gclifetime":3600,"ProviderConfig":"127.0.0.1:6379,100,astaxie"}`) go globalSessions.GC() }
-
Use MySQL as provider, the last param is the DSN, learn more from mysql:
func init() { globalSessions, _ = session.NewManager( "mysql", `{"cookieName":"gosessionid","gclifetime":3600,"ProviderConfig":"username:password@protocol(address)/dbname?param=value"}`) go globalSessions.GC() }
-
Use Cookie as provider:
func init() { globalSessions, _ = session.NewManager( "cookie", `{"cookieName":"gosessionid","enableSetCookie":false,"gclifetime":3600,"ProviderConfig":"{\"cookieName\":\"gosessionid\",\"securityKey\":\"beegocookiehashkey\"}"}`) go globalSessions.GC() }
Finally in the handlerfunc you can use it like this
func login(w http.ResponseWriter, r *http.Request) {
sess := globalSessions.SessionStart(w, r)
defer sess.SessionRelease(w)
username := sess.Get("username")
fmt.Println(username)
if r.Method == "GET" {
t, _ := template.ParseFiles("login.gtpl")
t.Execute(w, nil)
} else {
fmt.Println("username:", r.Form["username"])
sess.Set("username", r.Form["username"])
fmt.Println("password:", r.Form["password"])
}
}
How to write own provider?
When you develop a web app, maybe you want to write own provider because you must meet the requirements.
Writing a provider is easy. You only need to define two struct types (Session and Provider), which satisfy the interface definition. Maybe you will find the memory provider is a good example.
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(w http.ResponseWriter) // release the resource & save data to provider & return the data
Flush() error //delete all data
}
type Provider interface {
SessionInit(gclifetime int64, config string) error
SessionRead(sid string) (SessionStore, error)
SessionExist(sid string) (bool, error)
SessionRegenerate(oldsid, sid string) (SessionStore, error)
SessionDestroy(sid string) error
SessionAll() int //get all active session
SessionGC()
}
LICENSE
BSD License http://creativecommons.org/licenses/BSD/