3f0ec5c0 by 傅小黑

Merge branch 'develop' of git://github.com/astaxie/beego into develop

2 parents 0e287232 2fb57583
...@@ -398,6 +398,7 @@ func (c *Controller) SessionRegenerateID() { ...@@ -398,6 +398,7 @@ func (c *Controller) SessionRegenerateID() {
398 398
399 // DestroySession cleans session data and session cookie. 399 // DestroySession cleans session data and session cookie.
400 func (c *Controller) DestroySession() { 400 func (c *Controller) DestroySession() {
401 c.Ctx.Input.CruSession.Flush()
401 GlobalSessions.SessionDestroy(c.Ctx.ResponseWriter, c.Ctx.Request) 402 GlobalSessions.SessionDestroy(c.Ctx.ResponseWriter, c.Ctx.Request)
402 } 403 }
403 404
......
...@@ -16,7 +16,7 @@ var MAX_POOL_SIZE = 100 ...@@ -16,7 +16,7 @@ var MAX_POOL_SIZE = 100
16 var redisPool chan redis.Conn 16 var redisPool chan redis.Conn
17 17
18 type RedisSessionStore struct { 18 type RedisSessionStore struct {
19 c redis.Conn 19 p *redis.Pool
20 sid string 20 sid string
21 lock sync.RWMutex 21 lock sync.RWMutex
22 values map[interface{}]interface{} 22 values map[interface{}]interface{}
...@@ -60,13 +60,21 @@ func (rs *RedisSessionStore) SessionID() string { ...@@ -60,13 +60,21 @@ func (rs *RedisSessionStore) SessionID() string {
60 } 60 }
61 61
62 func (rs *RedisSessionStore) SessionRelease(w http.ResponseWriter) { 62 func (rs *RedisSessionStore) SessionRelease(w http.ResponseWriter) {
63 defer rs.c.Close() 63 c := rs.p.Get()
64 defer c.Close()
65
66 // if rs.values is empty, return directly
67 if len(rs.values) < 1 {
68 c.Do("DEL", rs.sid)
69 return
70 }
71
64 b, err := encodeGob(rs.values) 72 b, err := encodeGob(rs.values)
65 if err != nil { 73 if err != nil {
66 return 74 return
67 } 75 }
68 rs.c.Do("SET", rs.sid, string(b)) 76
69 rs.c.Do("EXPIRE", rs.sid, rs.maxlifetime) 77 c.Do("SET", rs.sid, string(b), "EX", rs.maxlifetime)
70 } 78 }
71 79
72 type RedisProvider struct { 80 type RedisProvider struct {
...@@ -116,10 +124,8 @@ func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error { ...@@ -116,10 +124,8 @@ func (rp *RedisProvider) SessionInit(maxlifetime int64, savePath string) error {
116 124
117 func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { 125 func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) {
118 c := rp.poollist.Get() 126 c := rp.poollist.Get()
119 if existed, err := redis.Int(c.Do("EXISTS", sid)); err != nil || existed == 0 { 127 defer c.Close()
120 c.Do("SET", sid) 128
121 }
122 c.Do("EXPIRE", sid, rp.maxlifetime)
123 kvs, err := redis.String(c.Do("GET", sid)) 129 kvs, err := redis.String(c.Do("GET", sid))
124 var kv map[interface{}]interface{} 130 var kv map[interface{}]interface{}
125 if len(kvs) == 0 { 131 if len(kvs) == 0 {
...@@ -130,13 +136,15 @@ func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { ...@@ -130,13 +136,15 @@ func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) {
130 return nil, err 136 return nil, err
131 } 137 }
132 } 138 }
133 rs := &RedisSessionStore{c: c, sid: sid, values: kv, maxlifetime: rp.maxlifetime} 139
140 rs := &RedisSessionStore{p: rp.poollist, sid: sid, values: kv, maxlifetime: rp.maxlifetime}
134 return rs, nil 141 return rs, nil
135 } 142 }
136 143
137 func (rp *RedisProvider) SessionExist(sid string) bool { 144 func (rp *RedisProvider) SessionExist(sid string) bool {
138 c := rp.poollist.Get() 145 c := rp.poollist.Get()
139 defer c.Close() 146 defer c.Close()
147
140 if existed, err := redis.Int(c.Do("EXISTS", sid)); err != nil || existed == 0 { 148 if existed, err := redis.Int(c.Do("EXISTS", sid)); err != nil || existed == 0 {
141 return false 149 return false
142 } else { 150 } else {
...@@ -146,11 +154,18 @@ func (rp *RedisProvider) SessionExist(sid string) bool { ...@@ -146,11 +154,18 @@ func (rp *RedisProvider) SessionExist(sid string) bool {
146 154
147 func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) { 155 func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) {
148 c := rp.poollist.Get() 156 c := rp.poollist.Get()
149 if existed, err := redis.Int(c.Do("EXISTS", oldsid)); err != nil || existed == 0 { 157 defer c.Close()
150 c.Do("SET", oldsid) 158
159 if existed, _ := redis.Int(c.Do("EXISTS", oldsid)); existed == 0 {
160 // oldsid doesn't exists, set the new sid directly
161 // ignore error here, since if it return error
162 // the existed value will be 0
163 c.Do("SET", sid, "", "EX", rp.maxlifetime)
164 } else {
165 c.Do("RENAME", oldsid, sid)
166 c.Do("EXPIRE", sid, rp.maxlifetime)
151 } 167 }
152 c.Do("RENAME", oldsid, sid) 168
153 c.Do("EXPIRE", sid, rp.maxlifetime)
154 kvs, err := redis.String(c.Do("GET", sid)) 169 kvs, err := redis.String(c.Do("GET", sid))
155 var kv map[interface{}]interface{} 170 var kv map[interface{}]interface{}
156 if len(kvs) == 0 { 171 if len(kvs) == 0 {
...@@ -161,13 +176,15 @@ func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, er ...@@ -161,13 +176,15 @@ func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, er
161 return nil, err 176 return nil, err
162 } 177 }
163 } 178 }
164 rs := &RedisSessionStore{c: c, sid: sid, values: kv, maxlifetime: rp.maxlifetime} 179
180 rs := &RedisSessionStore{p: rp.poollist, sid: sid, values: kv, maxlifetime: rp.maxlifetime}
165 return rs, nil 181 return rs, nil
166 } 182 }
167 183
168 func (rp *RedisProvider) SessionDestroy(sid string) error { 184 func (rp *RedisProvider) SessionDestroy(sid string) error {
169 c := rp.poollist.Get() 185 c := rp.poollist.Get()
170 defer c.Close() 186 defer c.Close()
187
171 c.Do("DEL", sid) 188 c.Do("DEL", sid)
172 return nil 189 return nil
173 } 190 }
...@@ -178,7 +195,6 @@ func (rp *RedisProvider) SessionGC() { ...@@ -178,7 +195,6 @@ func (rp *RedisProvider) SessionGC() {
178 195
179 //@todo 196 //@todo
180 func (rp *RedisProvider) SessionAll() int { 197 func (rp *RedisProvider) SessionAll() int {
181
182 return 0 198 return 0
183 } 199 }
184 200
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!