@@ -35,18 +35,18 @@ session的基本原理是由服务器为每个会话维护一份信息数据,
35
35
``` Go
36
36
37
37
type Manager struct {
38
- cookieName string // private cookiename
38
+ cookieName string // private cookiename
39
39
lock sync.Mutex // protects session
40
40
provider Provider
41
- maxlifetime int64
41
+ maxLifeTime int64
42
42
}
43
43
44
- func NewManager (provideName , cookieName string , maxlifetime int64 ) (*Manager , error ) {
44
+ func NewManager (provideName , cookieName string , maxLifeTime int64 ) (*Manager , error ) {
45
45
provider , ok := provides[provideName]
46
46
if !ok {
47
47
return nil , fmt.Errorf (" session: unknown provide %q (forgotten import?)" , provideName)
48
48
}
49
- return &Manager{provider: provider, cookieName: cookieName, maxlifetime: maxlifetime }, nil
49
+ return &Manager{provider: provider, cookieName: cookieName, maxLifeTime: maxLifeTime }, nil
50
50
}
51
51
52
52
```
@@ -56,7 +56,7 @@ Go实现整个的流程应该也是这样的,在main包中创建一个全局
56
56
var globalSessions *session.Manager
57
57
// 然后在init函数中初始化
58
58
func init () {
59
- globalSessions, _ = NewManager (" memory" ," gosessionid" ,3600 )
59
+ globalSessions, _ = NewManager (" memory" , " gosessionid" , 3600 )
60
60
}
61
61
```
62
62
我们知道session是保存在服务器端的数据,它可以以任何的方式存储,比如存储在内存、数据库或者文件中。因此我们抽象出一个Provider接口,用以表征session管理器底层存储结构。
@@ -78,10 +78,10 @@ type Provider interface {
78
78
``` Go
79
79
80
80
type Session interface {
81
- Set (key, value interface {}) error // set session value
82
- Get (key interface {}) interface {} // get session value
83
- Delete (key interface {}) error // delete session value
84
- SessionID () string // back current sessionID
81
+ Set (key, value interface {}) error // set session value
82
+ Get (key interface {}) interface {} // get session value
83
+ Delete (key interface {}) error // delete session value
84
+ SessionID () string // back current sessionID
85
85
}
86
86
```
87
87
> 以上设计思路来源于database/sql/driver,先定义好接口,然后具体的存储session的结构实现相应的接口并注册后,相应功能这样就可以使用了,以下是用来随需注册存储session的结构的Register函数的实现。
@@ -128,7 +128,7 @@ func (manager *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (se
128
128
if err != nil || cookie.Value == " " {
129
129
sid := manager.sessionId ()
130
130
session, _ = manager.provider .SessionInit (sid)
131
- cookie := http.Cookie {Name: manager.cookieName , Value: url.QueryEscape (sid), Path: " /" , HttpOnly: true , MaxAge: int (manager.maxlifetime )}
131
+ cookie := http.Cookie {Name: manager.cookieName , Value: url.QueryEscape (sid), Path: " /" , HttpOnly: true , MaxAge: int (manager.maxLifeTime )}
132
132
http.SetCookie (w, &cookie)
133
133
} else {
134
134
sid , _ := url.QueryUnescape (cookie.Value )
@@ -204,18 +204,21 @@ func (manager *Manager) SessionDestroy(w http.ResponseWriter, r *http.Request){
204
204
205
205
```
206
206
### session销毁
207
- 我们来看一下Session管理器如何来管理销毁, 只要我们在Main启动的时候启动:
207
+ 我们来看一下Session管理器如何来管理销毁, 只要我们在Main启动的时候启动:
208
208
``` Go
209
209
210
210
func init () {
211
211
go globalSessions.GC ()
212
212
}
213
+ ```
214
+
215
+ ``` Go
213
216
214
217
func (manager *Manager ) GC () {
215
218
manager.lock .Lock ()
216
219
defer manager.lock .Unlock ()
217
- manager.provider .SessionGC (manager.maxlifetime )
218
- time.AfterFunc (time.Duration (manager.maxlifetime ), func () { manager.GC () })
220
+ manager.provider .SessionGC (manager.maxLifeTime )
221
+ time.AfterFunc (time.Duration (manager.maxLifeTime ), func () { manager.GC () })
219
222
}
220
223
```
221
224
我们可以看到GC充分利用了time包中的定时器功能,当超时` maxLifeTime ` 之后调用GC函数,这样就可以保证` maxLifeTime ` 时间内的session都是可用的,类似的方案也可以用于统计在线用户数之类的。
0 commit comments