2019-go-09

beego 的模块化设计-session

session 模块是用来存储客户端用户,session 模块目前只支持 cookie 方式的请求,如果客户端不支持 cookie,那么就无法使用该模块。

session 模块参考了 database/sql 的引擎写法,采用了一个接口,多个实现的方式。目前实现了 memory、file、Redis 和 MySQL 四种存储引擎。

通过下面的方式安装 session:

go get github.com/astaxie/beego/session

初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14

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()
}

一个 JSON 字符串,传入 Manager 的配置信息

  1. cookieName: 客户端存储 cookie 的名字。
  2. enableSetCookie,omitempty: 是否开启 SetCookie,omitempty 这个设置
  3. gclifetime: 触发 GC 的时间。
  4. maxLifetime: 服务器端存储的数据的过期时间
  5. secure: 是否开启 HTTPS,在 cookie 设置的时候有 cookie.Secure 设置。
  6. sessionIDHashFunc: sessionID 生产的函数,默认是 sha1 算法。
  7. sessionIDHashKey: hash 算法中的 key。
  8. cookieLifeTime: 客户端存储的 cookie 的时间,默认值是 0,即浏览器生命周期。
  9. providerConfig: 配置信息,根据不同的引擎设置不同的配置信息,详细的配置请看下面的引擎设置

最后的逻辑处理

1
2
3
4
5
6
7
8
9
10
11
12

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"])
}
}