gorilla/sessions
几篇教程都讲的session原理还行但实现就很一般了,还是记一下。
初始化会话仓库
func sessions.NewFilesystemStore(path string, keyPairs ...[]byte) *sessions.FilesystemStore
这里使用的是本地文件存储会话为例,mysql或redis实现可以去查原项目的API。
path
为存储路径,keyPairs
为密钥,测试用的话随便设一个就行。
新建/获取session
func (s *FilesystemStore) New(r *http.Request, name string) (*Session, error)
func (s *FilesystemStore) Get(r *http.Request, name string) (*Session, error)
Get
方法其实复合了New
方法,当request中没有对应会话时返回一个新会话。name参数用来区别不同的会话,比如你要管理的是用户状态就可以用user之类。
保存session
func (s *FilesystemStore) Save(r *http.Request, w http.ResponseWriter, session *Session) error
这个方法同时将会话保存到本地和request。
操作session
session的定义如下:
type Session struct {
// The ID of the session, generated by stores. It should not be used for
// user data.
ID string
// Values contains the user-data for the session.
Values map[interface{}]interface{}
Options *Options
IsNew bool
// contains filtered or unexported fields
}
关于Session.ID
,它说是说会由store自动生成,可是我试了无论是Store.New()
方法还是sessions.NewSession()
方法生成的session的ID都是空的。所以还是建议手动赋值一个id,可以使用jakehl/goid
生成一个uuid。
要为session赋值或者从session中取出值,只需要操作session.Values
就行,例如:
session, err := Store.New(ctx.Request, "user")
session.Values["userid"]=123 // 赋值
userid = session.Values["userid"] // 取值
删除session
将session的过期时间设置为-1即可,store将自动从本地删除session,同时清空request里的session。
session.Options.MaxAge = -1