mirror of
https://github.com/astaxie/beego.git
synced 2024-11-24 15:10:54 +00:00
Merge pull request #4124 from phiphi282/session_exists_return_err
Update session provider interface to return errors on SessionExist
This commit is contained in:
commit
2fce8f9d1b
@ -101,7 +101,7 @@ Maybe you will find the **memory** provider is a good example.
|
||||
type Provider interface {
|
||||
SessionInit(gclifetime int64, config string) error
|
||||
SessionRead(sid string) (SessionStore, error)
|
||||
SessionExist(sid string) bool
|
||||
SessionExist(sid string) (bool, error)
|
||||
SessionRegenerate(oldsid, sid string) (SessionStore, error)
|
||||
SessionDestroy(sid string) error
|
||||
SessionAll() int //get all active session
|
||||
|
@ -179,16 +179,16 @@ func (cp *Provider) SessionRead(sid string) (session.Store, error) {
|
||||
|
||||
// SessionExist Check couchbase session exist.
|
||||
// it checkes sid exist or not.
|
||||
func (cp *Provider) SessionExist(sid string) bool {
|
||||
func (cp *Provider) SessionExist(sid string) (bool, error) {
|
||||
cp.b = cp.getBucket()
|
||||
defer cp.b.Close()
|
||||
|
||||
var doc []byte
|
||||
|
||||
if err := cp.b.Get(sid, &doc); err != nil || doc == nil {
|
||||
return false
|
||||
return false, err
|
||||
}
|
||||
return true
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// SessionRegenerate remove oldsid and use sid to generate new session
|
||||
|
@ -132,9 +132,9 @@ func (lp *Provider) SessionRead(sid string) (session.Store, error) {
|
||||
}
|
||||
|
||||
// SessionExist check ledis session exist by sid
|
||||
func (lp *Provider) SessionExist(sid string) bool {
|
||||
func (lp *Provider) SessionExist(sid string) (bool, error) {
|
||||
count, _ := c.Exists([]byte(sid))
|
||||
return count != 0
|
||||
return count != 0, nil
|
||||
}
|
||||
|
||||
// SessionRegenerate generate new sid for ledis session
|
||||
|
@ -149,16 +149,16 @@ func (rp *MemProvider) SessionRead(sid string) (session.Store, error) {
|
||||
}
|
||||
|
||||
// SessionExist check memcache session exist by sid
|
||||
func (rp *MemProvider) SessionExist(sid string) bool {
|
||||
func (rp *MemProvider) SessionExist(sid string) (bool, error) {
|
||||
if client == nil {
|
||||
if err := rp.connectInit(); err != nil {
|
||||
return false
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
if item, err := client.Get(sid); err != nil || len(item.Value) == 0 {
|
||||
return false
|
||||
return false, err
|
||||
}
|
||||
return true
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// SessionRegenerate generate new sid for memcache session
|
||||
|
@ -164,13 +164,19 @@ func (mp *Provider) SessionRead(sid string) (session.Store, error) {
|
||||
}
|
||||
|
||||
// SessionExist check mysql session exist
|
||||
func (mp *Provider) SessionExist(sid string) bool {
|
||||
func (mp *Provider) SessionExist(sid string) (bool, error) {
|
||||
c := mp.connectInit()
|
||||
defer c.Close()
|
||||
row := c.QueryRow("select session_data from "+TableName+" where session_key=?", sid)
|
||||
var sessiondata []byte
|
||||
err := row.Scan(&sessiondata)
|
||||
return err != sql.ErrNoRows
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return false, nil
|
||||
}
|
||||
return false, err
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// SessionRegenerate generate new sid for mysql session
|
||||
|
@ -178,13 +178,19 @@ func (mp *Provider) SessionRead(sid string) (session.Store, error) {
|
||||
}
|
||||
|
||||
// SessionExist check postgresql session exist
|
||||
func (mp *Provider) SessionExist(sid string) bool {
|
||||
func (mp *Provider) SessionExist(sid string) (bool, error) {
|
||||
c := mp.connectInit()
|
||||
defer c.Close()
|
||||
row := c.QueryRow("select session_data from session where session_key=$1", sid)
|
||||
var sessiondata []byte
|
||||
err := row.Scan(&sessiondata)
|
||||
return err != sql.ErrNoRows
|
||||
if err != nil {
|
||||
if err == sql.ErrNoRows {
|
||||
return false, nil
|
||||
}
|
||||
return false, err
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// SessionRegenerate generate new sid for postgresql session
|
||||
|
@ -211,14 +211,14 @@ func (rp *Provider) SessionRead(sid string) (session.Store, error) {
|
||||
}
|
||||
|
||||
// SessionExist check redis session exist by sid
|
||||
func (rp *Provider) SessionExist(sid string) bool {
|
||||
func (rp *Provider) SessionExist(sid string) (bool, error) {
|
||||
c := rp.poollist.Get()
|
||||
defer c.Close()
|
||||
|
||||
if existed, err := redis.Int(c.Do("EXISTS", sid)); err != nil || existed == 0 {
|
||||
return false
|
||||
return false, err
|
||||
}
|
||||
return true
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// SessionRegenerate generate new sid for redis session
|
||||
|
@ -176,12 +176,12 @@ func (rp *Provider) SessionRead(sid string) (session.Store, error) {
|
||||
}
|
||||
|
||||
// SessionExist check redis_cluster session exist by sid
|
||||
func (rp *Provider) SessionExist(sid string) bool {
|
||||
func (rp *Provider) SessionExist(sid string) (bool, error) {
|
||||
c := rp.poollist
|
||||
if existed, err := c.Exists(sid).Result(); err != nil || existed == 0 {
|
||||
return false
|
||||
return false, err
|
||||
}
|
||||
return true
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// SessionRegenerate generate new sid for redis_cluster session
|
||||
|
@ -189,12 +189,12 @@ func (rp *Provider) SessionRead(sid string) (session.Store, error) {
|
||||
}
|
||||
|
||||
// SessionExist check redis_sentinel session exist by sid
|
||||
func (rp *Provider) SessionExist(sid string) bool {
|
||||
func (rp *Provider) SessionExist(sid string) (bool, error) {
|
||||
c := rp.poollist
|
||||
if existed, err := c.Exists(sid).Result(); err != nil || existed == 0 {
|
||||
return false
|
||||
return false, err
|
||||
}
|
||||
return true
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// SessionRegenerate generate new sid for redis_sentinel session
|
||||
|
@ -147,8 +147,8 @@ func (pder *CookieProvider) SessionRead(sid string) (Store, error) {
|
||||
}
|
||||
|
||||
// SessionExist Cookie session is always existed
|
||||
func (pder *CookieProvider) SessionExist(sid string) bool {
|
||||
return true
|
||||
func (pder *CookieProvider) SessionExist(sid string) (bool, error) {
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// SessionRegenerate Implement method, no used.
|
||||
|
@ -176,17 +176,17 @@ func (fp *FileProvider) SessionRead(sid string) (Store, error) {
|
||||
|
||||
// SessionExist Check file session exist.
|
||||
// it checks the file named from sid exist or not.
|
||||
func (fp *FileProvider) SessionExist(sid string) bool {
|
||||
func (fp *FileProvider) SessionExist(sid string) (bool, error) {
|
||||
filepder.lock.Lock()
|
||||
defer filepder.lock.Unlock()
|
||||
|
||||
if len(sid) < 2 {
|
||||
SLogger.Println("min length of session id is 2", sid)
|
||||
return false
|
||||
SLogger.Println("min length of session id is 2 but got length: ", sid)
|
||||
return false, errors.New("min length of session id is 2")
|
||||
}
|
||||
|
||||
_, err := os.Stat(path.Join(fp.savePath, string(sid[0]), string(sid[1]), sid))
|
||||
return err == nil
|
||||
return err == nil, nil
|
||||
}
|
||||
|
||||
// SessionDestroy Remove all files in this save path
|
||||
|
@ -56,16 +56,24 @@ func TestFileProvider_SessionExist(t *testing.T) {
|
||||
|
||||
_ = fp.SessionInit(180, sessionPath)
|
||||
|
||||
if fp.SessionExist(sid) {
|
||||
exists, err := fp.SessionExist(sid)
|
||||
if err != nil{
|
||||
t.Error(err)
|
||||
}
|
||||
if exists {
|
||||
t.Error()
|
||||
}
|
||||
|
||||
_, err := fp.SessionRead(sid)
|
||||
_, err = fp.SessionRead(sid)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if !fp.SessionExist(sid) {
|
||||
exists, err = fp.SessionExist(sid)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if !exists {
|
||||
t.Error()
|
||||
}
|
||||
}
|
||||
@ -79,15 +87,27 @@ func TestFileProvider_SessionExist2(t *testing.T) {
|
||||
|
||||
_ = fp.SessionInit(180, sessionPath)
|
||||
|
||||
if fp.SessionExist(sid) {
|
||||
exists, err := fp.SessionExist(sid)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if exists {
|
||||
t.Error()
|
||||
}
|
||||
|
||||
if fp.SessionExist("") {
|
||||
exists, err = fp.SessionExist("")
|
||||
if err == nil {
|
||||
t.Error()
|
||||
}
|
||||
if exists {
|
||||
t.Error()
|
||||
}
|
||||
|
||||
if fp.SessionExist("1") {
|
||||
exists, err = fp.SessionExist("1")
|
||||
if err == nil {
|
||||
t.Error()
|
||||
}
|
||||
if exists {
|
||||
t.Error()
|
||||
}
|
||||
}
|
||||
@ -171,7 +191,11 @@ func TestFileProvider_SessionRegenerate(t *testing.T) {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if !fp.SessionExist(sid) {
|
||||
exists, err := fp.SessionExist(sid)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if !exists {
|
||||
t.Error()
|
||||
}
|
||||
|
||||
@ -180,11 +204,19 @@ func TestFileProvider_SessionRegenerate(t *testing.T) {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if fp.SessionExist(sid) {
|
||||
exists, err = fp.SessionExist(sid)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if exists {
|
||||
t.Error()
|
||||
}
|
||||
|
||||
if !fp.SessionExist(sidNew) {
|
||||
exists, err = fp.SessionExist(sidNew)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if !exists {
|
||||
t.Error()
|
||||
}
|
||||
}
|
||||
@ -203,7 +235,11 @@ func TestFileProvider_SessionDestroy(t *testing.T) {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if !fp.SessionExist(sid) {
|
||||
exists, err := fp.SessionExist(sid)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if !exists {
|
||||
t.Error()
|
||||
}
|
||||
|
||||
@ -212,7 +248,11 @@ func TestFileProvider_SessionDestroy(t *testing.T) {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
if fp.SessionExist(sid) {
|
||||
exists, err = fp.SessionExist(sid)
|
||||
if err != nil {
|
||||
t.Error(err)
|
||||
}
|
||||
if exists {
|
||||
t.Error()
|
||||
}
|
||||
}
|
||||
|
@ -109,13 +109,13 @@ func (pder *MemProvider) SessionRead(sid string) (Store, error) {
|
||||
}
|
||||
|
||||
// SessionExist check session store exist in memory session by sid
|
||||
func (pder *MemProvider) SessionExist(sid string) bool {
|
||||
func (pder *MemProvider) SessionExist(sid string) (bool, error) {
|
||||
pder.lock.RLock()
|
||||
defer pder.lock.RUnlock()
|
||||
if _, ok := pder.sessions[sid]; ok {
|
||||
return true
|
||||
return true, nil
|
||||
}
|
||||
return false
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// SessionRegenerate generate new sid for session store in memory session
|
||||
|
@ -56,7 +56,7 @@ type Store interface {
|
||||
type Provider interface {
|
||||
SessionInit(gclifetime int64, config string) error
|
||||
SessionRead(sid string) (Store, error)
|
||||
SessionExist(sid string) bool
|
||||
SessionExist(sid string) (bool, error)
|
||||
SessionRegenerate(oldsid, sid string) (Store, error)
|
||||
SessionDestroy(sid string) error
|
||||
SessionAll() int //get all active session
|
||||
@ -211,9 +211,15 @@ func (manager *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (se
|
||||
return nil, errs
|
||||
}
|
||||
|
||||
if sid != "" && manager.provider.SessionExist(sid) {
|
||||
if sid != "" {
|
||||
exists, err := manager.provider.SessionExist(sid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if exists {
|
||||
return manager.provider.SessionRead(sid)
|
||||
}
|
||||
}
|
||||
|
||||
// Generate a new session
|
||||
sid, errs = manager.sessionID()
|
||||
|
@ -68,10 +68,10 @@ func (p *Provider) SessionRead(sid string) (session.Store, error) {
|
||||
}
|
||||
|
||||
// SessionExist judged whether sid is exist in session
|
||||
func (p *Provider) SessionExist(sid string) bool {
|
||||
func (p *Provider) SessionExist(sid string) (bool, error) {
|
||||
if p.client == nil {
|
||||
if err := p.connectInit(); err != nil {
|
||||
panic(err)
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
value, err := p.client.Get(sid)
|
||||
@ -79,9 +79,9 @@ func (p *Provider) SessionExist(sid string) bool {
|
||||
panic(err)
|
||||
}
|
||||
if value == nil || len(value.(string)) == 0 {
|
||||
return false
|
||||
return false, nil
|
||||
}
|
||||
return true
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// SessionRegenerate regenerate session with new sid and delete oldsid
|
||||
|
Loading…
Reference in New Issue
Block a user