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