forked from wbteve/easygo
/
session.go
120 lines (107 loc) · 2.29 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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package easygo
import (
// "../../apps"
"github.com/matyhtf/easygo/php"
"bytes"
"log"
"net/http"
"os"
"time"
//"fmt"
"encoding/gob"
"io/ioutil"
"runtime"
// "strings"
)
type SessionType struct {
Id string
Change bool
Store *SessionItem
}
type SessionItem struct {
Data map[string]string
Expire int64
}
var session_map map[string]*SessionItem = make(map[string]*SessionItem, 100)
func NewSession(req *http.Request, resp http.ResponseWriter) *SessionType {
s := new(SessionType)
s.Change = false
cookie, err := req.Cookie(Server.SessionKey)
if err != nil {
s.Id, err = php.Uniqid()
if err != nil {
panic(err)
}
} else {
s.Id = cookie.Value
}
session := session_map[s.Id]
if session == nil {
session = new(SessionItem)
session.Data = make(map[string]string, 10)
var buf bytes.Buffer
b, err := ioutil.ReadFile(Server.SessionDir + s.Id)
if err == nil {
de := gob.NewDecoder(&buf)
buf.Write(b)
de.Decode(&session)
}
session_map[s.Id] = session
}
s.Store = session
expire := time.Now().Add(time.Duration(Server.SessionLifetime) * time.Second)
s.Store.Expire = expire.Unix()
http.SetCookie(resp, &http.Cookie{
Name: Server.SessionKey,
Value: s.Id,
Path: "/",
Expires: expire,
})
return s
}
func (s *SessionType) Init() {
if !php.FileExists(Server.SessionDir) {
os.Mkdir(Server.SessionDir, 0755)
}
}
func (s *SessionType) Set(key string, value string) {
s.Store.Data[key] = value
s.Change = true
}
func (s *SessionType) Get(key string) string {
return s.Store.Data[key]
}
func (s *SessionType) Del(key string) {
delete(s.Store.Data, key)
s.Change = true
}
func (s *SessionType) Save() {
if len(session_map[s.Id].Data) == 0 || !s.Change{
return
}
var buf bytes.Buffer
en := gob.NewEncoder(&buf)
err := en.Encode(session_map[s.Id])
if err != nil {
log.Fatal("encode error:", err)
}
err = ioutil.WriteFile(Server.SessionDir+s.Id, buf.Bytes(), 0755)
if err != nil {
log.Fatal("write file error:", err)
}
}
func Session_CheckExpire() {
timer := time.NewTicker(60 * time.Second)
for {
<-timer.C
//log.Println("session_check_expire")
now := time.Now().Unix()
for i, session := range session_map {
if session.Expire < now {
delete(session_map, i)
os.Remove(Server.SessionDir + i)
runtime.Gosched()
}
}
}
}