c8f86652 by astaxie

fix #248

1 parent 076bd0b4
...@@ -116,6 +116,15 @@ func (fp *FileProvider) SessionRead(sid string) (SessionStore, error) { ...@@ -116,6 +116,15 @@ func (fp *FileProvider) SessionRead(sid string) (SessionStore, error) {
116 return ss, nil 116 return ss, nil
117 } 117 }
118 118
119 func (fp *FileProvider) SessionExist(sid string) bool {
120 _, err := os.Stat(path.Join(fp.savePath, string(sid[0]), string(sid[1]), sid))
121 if err == nil {
122 return true
123 } else {
124 return false
125 }
126 }
127
119 func (fp *FileProvider) SessionDestroy(sid string) error { 128 func (fp *FileProvider) SessionDestroy(sid string) error {
120 os.Remove(path.Join(fp.savePath)) 129 os.Remove(path.Join(fp.savePath))
121 return nil 130 return nil
......
...@@ -87,6 +87,16 @@ func (pder *MemProvider) SessionRead(sid string) (SessionStore, error) { ...@@ -87,6 +87,16 @@ func (pder *MemProvider) SessionRead(sid string) (SessionStore, error) {
87 return nil, nil 87 return nil, nil
88 } 88 }
89 89
90 func (pder *MemProvider) SessionExist(sid string) bool {
91 pder.lock.RLock()
92 defer pder.lock.RUnlock()
93 if _, ok := pder.sessions[sid]; ok {
94 return true
95 } else {
96 return false
97 }
98 }
99
90 func (pder *MemProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) { 100 func (pder *MemProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) {
91 pder.lock.RLock() 101 pder.lock.RLock()
92 if element, ok := pder.sessions[oldsid]; ok { 102 if element, ok := pder.sessions[oldsid]; ok {
......
...@@ -110,6 +110,18 @@ func (mp *MysqlProvider) SessionRead(sid string) (SessionStore, error) { ...@@ -110,6 +110,18 @@ func (mp *MysqlProvider) SessionRead(sid string) (SessionStore, error) {
110 return rs, nil 110 return rs, nil
111 } 111 }
112 112
113 func (mp *MysqlProvider) SessionExist(sid string) bool {
114 c := mp.connectInit()
115 row := c.QueryRow("select session_data from session where session_key=?", sid)
116 var sessiondata []byte
117 err := row.Scan(&sessiondata)
118 if err == sql.ErrNoRows {
119 return false
120 } else {
121 return true
122 }
123 }
124
113 func (mp *MysqlProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) { 125 func (mp *MysqlProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) {
114 c := mp.connectInit() 126 c := mp.connectInit()
115 row := c.QueryRow("select session_data from session where session_key=?", oldsid) 127 row := c.QueryRow("select session_data from session where session_key=?", oldsid)
......
...@@ -145,6 +145,15 @@ func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) { ...@@ -145,6 +145,15 @@ func (rp *RedisProvider) SessionRead(sid string) (SessionStore, error) {
145 return rs, nil 145 return rs, nil
146 } 146 }
147 147
148 func (rp *RedisProvider) SessionExist(sid string) bool {
149 c := rp.poollist.Get()
150 if str, err := redis.String(c.Do("HGET", sid, sid)); err != nil || str == "" {
151 return false
152 } else {
153 return true
154 }
155 }
156
148 func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) { 157 func (rp *RedisProvider) SessionRegenerate(oldsid, sid string) (SessionStore, error) {
149 c := rp.poollist.Get() 158 c := rp.poollist.Get()
150 if str, err := redis.String(c.Do("HGET", oldsid, oldsid)); err != nil || str == "" { 159 if str, err := redis.String(c.Do("HGET", oldsid, oldsid)); err != nil || str == "" {
......
...@@ -25,6 +25,7 @@ type SessionStore interface { ...@@ -25,6 +25,7 @@ type SessionStore interface {
25 type Provider interface { 25 type Provider interface {
26 SessionInit(maxlifetime int64, savePath string) error 26 SessionInit(maxlifetime int64, savePath string) error
27 SessionRead(sid string) (SessionStore, error) 27 SessionRead(sid string) (SessionStore, error)
28 SessionExist(sid string) bool
28 SessionRegenerate(oldsid, sid string) (SessionStore, error) 29 SessionRegenerate(oldsid, sid string) (SessionStore, error)
29 SessionDestroy(sid string) error 30 SessionDestroy(sid string) error
30 SessionAll() int //get all active session 31 SessionAll() int //get all active session
...@@ -133,7 +134,22 @@ func (manager *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (se ...@@ -133,7 +134,22 @@ func (manager *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (se
133 r.AddCookie(cookie) 134 r.AddCookie(cookie)
134 } else { 135 } else {
135 sid, _ := url.QueryUnescape(cookie.Value) 136 sid, _ := url.QueryUnescape(cookie.Value)
136 session, _ = manager.provider.SessionRead(sid) 137 if manager.provider.SessionExist(sid) {
138 session, _ = manager.provider.SessionRead(sid)
139 } else {
140 sid = manager.sessionId(r)
141 session, _ = manager.provider.SessionRead(sid)
142 cookie = &http.Cookie{Name: manager.cookieName,
143 Value: url.QueryEscape(sid),
144 Path: "/",
145 HttpOnly: true,
146 Secure: manager.secure}
147 if manager.maxage >= 0 {
148 cookie.MaxAge = manager.maxage
149 }
150 http.SetCookie(w, cookie)
151 r.AddCookie(cookie)
152 }
137 } 153 }
138 return 154 return
139 } 155 }
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!