forked from eaciit/knot
/
session.go
75 lines (63 loc) · 1.47 KB
/
session.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package knot
import (
"github.com/eaciit/toolkit"
"time"
)
type Sessions map[string]toolkit.M
var (
sessionCookieId string
sessions Sessions
)
func SetSessionCookieId(id string) {
sessionCookieId = id
}
func SessionCookieId() string {
if sessionCookieId == "" {
sessionCookieId = "KnotSessionId"
}
return sessionCookieId
}
func InitSessions() *Sessions {
if sessions == nil {
sessions = map[string]toolkit.M{}
}
return &sessions
}
func (s Sessions) InitTokenBucket(tokenid string) {
if _, b := s[tokenid]; !b {
s[tokenid] = toolkit.M{}
}
}
func (s Sessions) Set(tokenid, key string, value interface{}) {
s.InitTokenBucket(tokenid)
s[tokenid].Set(key, value)
}
func (s Sessions) Get(tokenid, key string, def interface{}) interface{} {
s.InitTokenBucket(tokenid)
return s[tokenid].Get(key, def)
}
func getSessionTokenIdFromCookie(r *Request) string {
tokenId := ""
c, _ := r.Cookie(SessionCookieId())
if c == nil {
tokenId = toolkit.GenerateRandomString("", 32)
r.SetCookie(SessionCookieId(), tokenId, time.Hour*24*30)
} else {
tokenId = c.Value
}
return tokenId
}
func (r *Request) Session(key string, defs ...interface{}) interface{} {
InitSessions()
tokenId := getSessionTokenIdFromCookie(r)
var def interface{}
if len(defs) > 0 {
def = defs[0]
}
return sessions.Get(tokenId, key, def)
}
func (r *Request) SetSession(key string, value interface{}) {
InitSessions()
tokenId := getSessionTokenIdFromCookie(r)
sessions.Set(tokenId, key, value)
}