wide/user/sessions.go

73 lines
1.5 KiB
Go
Raw Normal View History

2014-08-31 13:39:39 +04:00
package user
import (
2014-09-16 19:58:52 +04:00
"math/rand"
"strconv"
"time"
2014-09-17 05:41:22 +04:00
"github.com/golang/glog"
2014-08-31 13:39:39 +04:00
"github.com/gorilla/sessions"
)
2014-09-16 19:58:52 +04:00
const (
SessionStateActive = iota // 会话状态:活的
)
// 用户 HTTP 会话,用于验证登录.
2014-09-17 06:11:18 +04:00
var HTTPSession = sessions.NewCookieStore([]byte("BEYOND"))
2014-09-16 19:58:52 +04:00
// Wide 会话,对应一个浏览器 tab.
type WideSession struct {
2014-09-17 05:41:22 +04:00
Id string // 唯一标识
HTTPSessionId string // HTTP 会话 id
State int // 状态
Created time.Time // 创建时间
Updated time.Time // 最近一次使用时间
2014-09-16 19:58:52 +04:00
}
2014-09-17 05:41:22 +04:00
type Sessions []*WideSession
// 所有 Wide 会话集.
var WideSessions Sessions
2014-09-16 19:58:52 +04:00
// 创建一个 Wide 会话.
2014-09-17 05:41:22 +04:00
func (sessions *Sessions) New() *WideSession {
2014-09-16 19:58:52 +04:00
rand.Seed(time.Now().UnixNano())
id := strconv.Itoa(rand.Int())
now := time.Now()
2014-09-17 05:41:22 +04:00
ret := &WideSession{
2014-09-16 19:58:52 +04:00
Id: id,
State: SessionStateActive,
Created: now,
Updated: now,
}
2014-09-17 05:41:22 +04:00
*sessions = append(*sessions, ret)
return ret
}
// 移除 Wide 会话.
func (sessions *Sessions) Remove(sid string) {
for i, s := range *sessions {
if s.Id == sid {
*sessions = append((*sessions)[:i], (*sessions)[i+1:]...)
glog.V(3).Infof("Has [%d] wide sessions currently", len(*sessions))
}
}
}
// 移除 HTTP 会话关联的所有 Wide 会话.
func (sessions *Sessions) RemoveByHTTPSid(httpSessionId string) {
for i, s := range *sessions {
if s.HTTPSessionId == httpSessionId {
*sessions = append((*sessions)[:i], (*sessions)[i+1:]...)
glog.V(3).Infof("Has [%d] wide sessions currently", len(*sessions))
}
}
2014-09-16 19:58:52 +04:00
}