Middleware session provides session management for Macaron Instances.
GitHub
go get github.com/go-macaron/session
import ("github.com/go-macaron/session""gopkg.in/macaron.v1")func main() {m := macaron.Classic()m.Use(macaron.Renderer())m.Use(session.Sessioner())m.Get("/", func(sess session.Store) string {sess.Set("session", "session middleware")return sess.Get("session").(string)})m.Get("/signup", func(ctx *macaron.Context, f *session.Flash) {f.Success("yes!!!")f.Error("opps...")f.Info("aha?!")f.Warning("Just be careful.")ctx.HTML(200, "signup")})m.Run()}
<!-- templates/signup.tmpl --><h2>{{.Flash.SuccessMsg}}</h2><h2>{{.Flash.ErrorMsg}}</h2><h2>{{.Flash.InfoMsg}}</h2><h2>{{.Flash.WarningMsg}}</h2>
If you're using pongo2 as template engine, you will use flash in HTML as follows:
<!-- templates/signup.tmpl --><h2>{{Flash.SuccessMsg}}</h2><h2>{{Flash.ErrorMsg}}</h2><h2>{{Flash.InfoMsg}}</h2><h2>{{Flash.WarningMsg}}</h2>
By default, flash will be only used for the next coming response corresponding to the session, but functions Success
, Error
, Info
and Warning
are all accept a second argument to indicate whether output flash in current response or not.
// ...f.Success("yes!!!", true)f.Error("opps...", true)f.Info("aha?!", true)f.Warning("Just be careful.", true)// ...
But remember, flash can only be used once no matter which way you use.
session.Sessioner
comes with a variety of configuration options(session.Options
):
//...m.Use(session.Sessioner(session.Options{// Name of provider. Default is "memory".Provider: "memory",// Provider configuration, it's corresponding to provider.ProviderConfig: "",// Cookie name to save session ID. Default is "MacaronSession".CookieName: "MacaronSession",// Cookie path to store. Default is "/".CookiePath: "/",// GC interval time in seconds. Default is 3600.Gclifetime: 3600,// Max life time in seconds. Default is whatever GC interval time is.Maxlifetime: 3600,// Use HTTPS only. Default is false.Secure: false,// Cookie life time. Default is 0.CookieLifeTime: 0,// Cookie domain name. Default is empty.Domain: "",// Session ID length. Default is 16.IDLength: 16,// Configuration section name. Default is "session".Section: "session",}))//...
There are 9 built-in implementations of session provider, you have to import provider driver explicitly except for memory and file providers.
Following are some basic usage examples for providers.
//...m.Use(session.Sessioner())//...
//...m.Use(session.Sessioner(session.Options{Provider: "file",ProviderConfig: "data/sessions",}))//...
import _ "github.com/go-macaron/session/redis"//...m.Use(session.Sessioner(session.Options{Provider: "redis",// e.g.: network=tcp,addr=127.0.0.1:6379,password=macaron,db=0,pool_size=100,idle_timeout=180,prefix=session:ProviderConfig: "addr=127.0.0.1:6379,password=macaron",}))//...
import _ "github.com/go-macaron/session/memcache"//...m.Use(session.Sessioner(session.Options{Provider: "memcache",// e.g.: 127.0.0.1:9090;127.0.0.1:9091ProviderConfig: "127.0.0.1:9090",}))//...
Use following SQL to create database(make sure key
length matches your Options.IDLength
):
CREATE TABLE session (key CHAR(16) NOT NULL,data BYTEA,expiry INTEGER NOT NULL,PRIMARY KEY (key));
import _ "github.com/go-macaron/session/postgres"//...m.Use(session.Sessioner(session.Options{Provider: "postgres",ProviderConfig: "user=a password=b host=localhost port=5432 dbname=c sslmode=disable",}))//...
Use following SQL to create database:
CREATE TABLE `session` (`key` CHAR(16) NOT NULL,`data` BLOB,`expiry` INT(11) UNSIGNED NOT NULL,PRIMARY KEY (`key`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;
import _ "github.com/go-macaron/session/mysql"//...m.Use(session.Sessioner(session.Options{Provider: "mysql",ProviderConfig: "username:password@protocol(address)/dbname?param=value",}))//...
import _ "github.com/go-macaron/session/couchbase"//...m.Use(session.Sessioner(session.Options{Provider: "couchbase",ProviderConfig: "username:password@protocol(address)/dbname?param=value",}))//...
import _ "github.com/go-macaron/session/ledis"//...m.Use(session.Sessioner(session.Options{Provider: "ledis",ProviderConfig: "data_dir=./app.db,db=0",}))//...
import _ "github.com/go-macaron/session/nodb"//...m.Use(session.Sessioner(session.Options{Provider: "nodb",ProviderConfig: "data/cache.db",}))//...
In case you need to have your own implementation of session storage and provider, you can implement following two interfaces and take memory provider as a study example.
// RawStore is the interface that operates the session data.type RawStore interface {// Set sets value to given key in session.Set(key, value interface{}) error// Get gets value by given key in session.Get(key interface{}) interface{}// Delete deletes a key from session.Delete(key interface{}) error// ID returns current session ID.ID() string// Release releases session resource and save data to provider.Release() error// Flush deletes all session data.Flush() error}// Provider is the interface that provides session manipulations.type Provider interface {// Init initializes session provider.Init(gclifetime int64, config string) error// Read returns raw session store by session ID.Read(sid string) (RawStore, error)// Exist returns true if session with given ID exists.Exist(sid string) bool// Destory deletes a session by session ID.Destory(sid string) error// Regenerate regenerates a session store from old session ID to new one.Regenerate(oldsid, sid string) (RawStore, error)// Count counts and returns number of sessions.Count() int// GC calls GC to clean expired sessions.GC()}