fix #248
Showing
5 changed files
with
56 additions
and
0 deletions
| ... | @@ -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) |
| 137 | if manager.provider.SessionExist(sid) { | ||
| 136 | session, _ = manager.provider.SessionRead(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 | } | ... | ... |
-
Please register or sign in to post a comment