Skip to content

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