diff --git a/g/net/ghttp/ghttp_server_config.go b/g/net/ghttp/ghttp_server_config.go index 50af99bc3..f73cfe606 100644 --- a/g/net/ghttp/ghttp_server_config.go +++ b/g/net/ghttp/ghttp_server_config.go @@ -24,7 +24,7 @@ const ( NAME_TO_URI_TYPE_CAMEL = 3 // 采用驼峰命名方式 gDEFAULT_COOKIE_PATH = "/" // 默认path gDEFAULT_COOKIE_MAX_AGE = 86400*365 // 默认cookie有效期(一年) - gDEFAULT_SESSION_MAX_AGE = 600 // 默认session有效期(600秒) + gDEFAULT_SESSION_MAX_AGE = 600000 // 默认session有效期(600秒) gDEFAULT_SESSION_ID_NAME = "gfsessionid" // 默认存放Cookie中的SessionId名称 gCHANGE_CONFIG_WHILE_RUNNING_ERROR = "cannot be changed while running" ) diff --git a/g/net/ghttp/ghttp_server_cookie.go b/g/net/ghttp/ghttp_server_cookie.go index 1dac80c39..97689b620 100644 --- a/g/net/ghttp/ghttp_server_cookie.go +++ b/g/net/ghttp/ghttp_server_cookie.go @@ -87,6 +87,14 @@ func (c *Cookie) SessionId() string { return id } +// 获取SessionId,不存在时则创建 +func (c *Cookie) MakeSessionId() string { + c.init() + id := makeSessionId() + c.SetSessionId(id) + return id +} + // 判断Cookie中是否存在制定键名(并且没有过期) func (c *Cookie) Contains(key string) bool { c.init() diff --git a/g/net/ghttp/ghttp_server_session.go b/g/net/ghttp/ghttp_server_session.go index f7ec825e7..429262c6f 100644 --- a/g/net/ghttp/ghttp_server_session.go +++ b/g/net/ghttp/ghttp_server_session.go @@ -41,15 +41,24 @@ func GetSession(r *Request) *Session { } } -// 执行初始化(用于延迟初始化) -// @TODO 验证提交的SESSIONID合法性 +// 执行初始化(用于延迟初始化). func (s *Session) init() { if len(s.id) == 0 { - s.id = s.request.Cookie.SessionId() s.server = s.request.Server - s.data = s.server.sessions.GetOrSetFuncLock(s.id, func() interface{} { - return gmap.NewStringInterfaceMap() - }, s.server.GetSessionMaxAge()).(*gmap.StringInterfaceMap) + // 根据提交的SESSION ID获取已存在SESSION + id := s.request.Cookie.GetSessionId() + if id != "" { + data := s.server.sessions.Get(id) + if data != nil { + s.id = id + s.data = data.(*gmap.StringInterfaceMap) + return + } + } + // 否则执行初始化创建 + s.id = s.request.Cookie.MakeSessionId() + s.data = gmap.NewStringInterfaceMap() + s.server.sessions.Set(s.id, s.data, s.server.GetSessionMaxAge()) } }