2019-02-02 16:18:25 +08:00
|
|
|
|
// Copyright 2017 gf Author(https://github.com/gogf/gf). All Rights Reserved.
|
2017-12-29 16:03:30 +08:00
|
|
|
|
//
|
|
|
|
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
|
|
|
|
// If a copy of the MIT was not distributed with this file,
|
2019-02-02 16:18:25 +08:00
|
|
|
|
// You can obtain one at https://github.com/gogf/gf.
|
2017-12-31 12:15:04 +08:00
|
|
|
|
// 并发安全的Session管理器
|
2017-12-31 18:19:58 +08:00
|
|
|
|
|
2017-12-31 12:15:04 +08:00
|
|
|
|
package ghttp
|
2017-12-11 18:21:30 +08:00
|
|
|
|
|
|
|
|
|
|
import (
|
2019-02-02 16:18:25 +08:00
|
|
|
|
"github.com/gogf/gf/g/container/gmap"
|
|
|
|
|
|
"github.com/gogf/gf/g/container/gvar"
|
|
|
|
|
|
"github.com/gogf/gf/g/os/gtime"
|
|
|
|
|
|
"github.com/gogf/gf/g/util/gconv"
|
|
|
|
|
|
"github.com/gogf/gf/g/util/grand"
|
2018-11-16 18:20:09 +08:00
|
|
|
|
"strconv"
|
|
|
|
|
|
"strings"
|
2018-10-13 22:43:35 +08:00
|
|
|
|
"time"
|
2017-12-11 18:21:30 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
2018-11-16 18:20:09 +08:00
|
|
|
|
// SESSION对象
|
2017-12-11 18:21:30 +08:00
|
|
|
|
type Session struct {
|
2018-11-16 18:20:09 +08:00
|
|
|
|
id string // SessionId
|
2019-05-08 17:21:18 +08:00
|
|
|
|
data *gmap.StrAnyMap // Session数据
|
2018-11-16 18:20:09 +08:00
|
|
|
|
server *Server // 所属Server
|
|
|
|
|
|
request *Request // 关联的请求
|
2017-12-11 18:21:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-03-11 16:14:55 +08:00
|
|
|
|
// 生成一个唯一的SessionId字符串,长度18位。
|
2017-12-31 12:15:04 +08:00
|
|
|
|
func makeSessionId() string {
|
2019-03-11 16:14:55 +08:00
|
|
|
|
return strings.ToUpper(strconv.FormatInt(gtime.Nanosecond(), 36) + grand.RandStr(6))
|
2017-12-11 18:21:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-11-23 09:20:45 +08:00
|
|
|
|
// 获取或者生成一个session对象(延迟初始化)
|
2018-04-10 10:32:37 +08:00
|
|
|
|
func GetSession(r *Request) *Session {
|
2018-11-23 09:20:45 +08:00
|
|
|
|
if r.Session != nil {
|
|
|
|
|
|
return r.Session
|
|
|
|
|
|
}
|
2018-11-16 18:20:09 +08:00
|
|
|
|
return &Session {
|
|
|
|
|
|
request : r,
|
2017-12-11 18:21:30 +08:00
|
|
|
|
}
|
2018-11-16 18:20:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-03-11 16:33:51 +08:00
|
|
|
|
// 执行初始化(用于延迟初始化).
|
2018-11-16 18:20:09 +08:00
|
|
|
|
func (s *Session) init() {
|
|
|
|
|
|
if len(s.id) == 0 {
|
2019-02-26 17:17:11 +08:00
|
|
|
|
s.server = s.request.Server
|
2019-03-11 16:33:51 +08:00
|
|
|
|
// 根据提交的SESSION ID获取已存在SESSION
|
|
|
|
|
|
id := s.request.Cookie.GetSessionId()
|
|
|
|
|
|
if id != "" {
|
|
|
|
|
|
data := s.server.sessions.Get(id)
|
|
|
|
|
|
if data != nil {
|
|
|
|
|
|
s.id = id
|
2019-05-08 17:21:18 +08:00
|
|
|
|
s.data = data.(*gmap.StrAnyMap)
|
2019-03-11 16:33:51 +08:00
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 否则执行初始化创建
|
|
|
|
|
|
s.id = s.request.Cookie.MakeSessionId()
|
2019-05-08 17:21:18 +08:00
|
|
|
|
s.data = gmap.NewStrAnyMap()
|
2019-03-11 16:33:51 +08:00
|
|
|
|
s.server.sessions.Set(s.id, s.data, s.server.GetSessionMaxAge())
|
2017-12-11 18:21:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-02-25 15:20:57 +08:00
|
|
|
|
// 获取/创建SessionId
|
2017-12-31 12:15:04 +08:00
|
|
|
|
func (s *Session) Id() string {
|
2018-11-16 18:20:09 +08:00
|
|
|
|
s.init()
|
2017-12-12 17:25:50 +08:00
|
|
|
|
return s.id
|
2017-12-11 18:21:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取当前session所有数据
|
2019-04-25 22:14:20 +08:00
|
|
|
|
func (s *Session) Map() map[string]interface{} {
|
2019-02-25 15:20:57 +08:00
|
|
|
|
if len(s.id) > 0 || s.request.Cookie.GetSessionId() != "" {
|
|
|
|
|
|
s.init()
|
|
|
|
|
|
return s.data.Map()
|
|
|
|
|
|
}
|
|
|
|
|
|
return nil
|
2017-12-11 18:21:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 设置session
|
2018-11-16 18:20:09 +08:00
|
|
|
|
func (s *Session) Set(key string, value interface{}) {
|
|
|
|
|
|
s.init()
|
2018-10-13 22:43:35 +08:00
|
|
|
|
s.data.Set(key, value)
|
2017-12-11 18:21:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-12-31 12:15:04 +08:00
|
|
|
|
// 批量设置
|
2019-05-08 17:21:18 +08:00
|
|
|
|
func (s *Session) Sets(m map[string]interface{}) {
|
2018-11-16 18:20:09 +08:00
|
|
|
|
s.init()
|
2019-05-08 17:21:18 +08:00
|
|
|
|
s.data.Sets(m)
|
2017-12-31 12:15:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-09-04 00:07:06 +08:00
|
|
|
|
// 判断键名是否存在
|
2018-10-13 22:43:35 +08:00
|
|
|
|
func (s *Session) Contains (key string) bool {
|
2019-02-26 17:17:11 +08:00
|
|
|
|
if len(s.id) > 0 || s.request.Cookie.GetSessionId() != "" {
|
2019-02-25 15:20:57 +08:00
|
|
|
|
s.init()
|
|
|
|
|
|
return s.data.Contains(key)
|
|
|
|
|
|
}
|
|
|
|
|
|
return false
|
2018-09-04 00:07:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-03-15 14:54:01 +08:00
|
|
|
|
// 获取SESSION变量
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) Get(key string, def...interface{}) interface{} {
|
2019-02-26 17:17:11 +08:00
|
|
|
|
if len(s.id) > 0 || s.request.Cookie.GetSessionId() != "" {
|
2019-02-25 15:20:57 +08:00
|
|
|
|
s.init()
|
2019-05-09 14:19:27 +08:00
|
|
|
|
if v := s.data.Get(key); v != nil {
|
|
|
|
|
|
return v
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if len(def) > 0 {
|
|
|
|
|
|
return def[0]
|
2019-02-25 15:20:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
return nil
|
2018-11-16 18:20:09 +08:00
|
|
|
|
}
|
2018-11-23 09:20:45 +08:00
|
|
|
|
|
|
|
|
|
|
// 获取SESSION,建议都用该方法获取参数
|
2019-05-10 13:38:06 +08:00
|
|
|
|
func (s *Session) GetVar(key string, def...interface{}) *gvar.Var {
|
2019-05-11 17:56:14 +08:00
|
|
|
|
return gvar.New(s.Get(key, def...), true)
|
2018-11-23 09:20:45 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-10-13 22:43:35 +08:00
|
|
|
|
// 删除session
|
2018-11-23 09:20:45 +08:00
|
|
|
|
func (s *Session) Remove(key string) {
|
2019-02-26 17:17:11 +08:00
|
|
|
|
if len(s.id) > 0 || s.request.Cookie.GetSessionId() != "" {
|
2019-02-25 15:20:57 +08:00
|
|
|
|
s.init()
|
|
|
|
|
|
s.data.Remove(key)
|
|
|
|
|
|
}
|
2017-12-13 14:13:36 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-10-13 22:43:35 +08:00
|
|
|
|
// 清空session
|
2018-11-23 09:20:45 +08:00
|
|
|
|
func (s *Session) Clear() {
|
2019-02-26 17:17:11 +08:00
|
|
|
|
if len(s.id) > 0 || s.request.Cookie.GetSessionId() != "" {
|
2019-02-25 15:20:57 +08:00
|
|
|
|
s.init()
|
|
|
|
|
|
s.data.Clear()
|
|
|
|
|
|
}
|
2017-12-11 18:21:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2017-12-31 12:15:04 +08:00
|
|
|
|
// 更新过期时间(如果用在守护进程中长期使用,需要手动调用进行更新,防止超时被清除)
|
|
|
|
|
|
func (s *Session) UpdateExpire() {
|
2019-02-26 17:17:11 +08:00
|
|
|
|
if len(s.id) > 0 && s.data.Size() > 0 {
|
2018-11-16 18:20:09 +08:00
|
|
|
|
s.server.sessions.Set(s.id, s.data, s.server.GetSessionMaxAge()*1000)
|
|
|
|
|
|
}
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetString(key string, def...interface{}) string {
|
|
|
|
|
|
return gconv.String(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetBool(key string, def...interface{}) bool {
|
|
|
|
|
|
return gconv.Bool(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetInt(key string, def...interface{}) int {
|
|
|
|
|
|
return gconv.Int(s.Get(key, def...))
|
|
|
|
|
|
}
|
2019-03-15 14:54:01 +08:00
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetInt8(key string, def...interface{}) int8 {
|
|
|
|
|
|
return gconv.Int8(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetInt16(key string, def...interface{}) int16 {
|
|
|
|
|
|
return gconv.Int16(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetInt32(key string, def...interface{}) int32 {
|
|
|
|
|
|
return gconv.Int32(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetInt64(key string, def...interface{}) int64 {
|
|
|
|
|
|
return gconv.Int64(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetUint(key string, def...interface{}) uint {
|
|
|
|
|
|
return gconv.Uint(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetUint8(key string, def...interface{}) uint8 {
|
|
|
|
|
|
return gconv.Uint8(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetUint16(key string, def...interface{}) uint16 {
|
|
|
|
|
|
return gconv.Uint16(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetUint32(key string, def...interface{}) uint32 {
|
|
|
|
|
|
return gconv.Uint32(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetUint64(key string, def...interface{}) uint64 {
|
|
|
|
|
|
return gconv.Uint64(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetFloat32(key string, def...interface{}) float32 {
|
|
|
|
|
|
return gconv.Float32(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetFloat64(key string, def...interface{}) float64 {
|
|
|
|
|
|
return gconv.Float64(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetBytes(key string, def...interface{}) []byte {
|
|
|
|
|
|
return gconv.Bytes(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetInts(key string, def...interface{}) []int {
|
|
|
|
|
|
return gconv.Ints(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetFloats(key string, def...interface{}) []float64 {
|
|
|
|
|
|
return gconv.Floats(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetStrings(key string, def...interface{}) []string {
|
|
|
|
|
|
return gconv.Strings(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
func (s *Session) GetInterfaces(key string, def...interface{}) []interface{} {
|
|
|
|
|
|
return gconv.Interfaces(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (s *Session) GetTime(key string, format...string) time.Time {
|
|
|
|
|
|
return gconv.Time(s.Get(key), format...)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-03-15 14:54:01 +08:00
|
|
|
|
func (s *Session) GetGTime(key string, format...string) *gtime.Time {
|
|
|
|
|
|
return gconv.GTime(s.Get(key), format...)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 17:14:24 +08:00
|
|
|
|
func (s *Session) GetDuration(key string, def...interface{}) time.Duration {
|
|
|
|
|
|
return gconv.Duration(s.Get(key, def...))
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2019-05-09 14:19:27 +08:00
|
|
|
|
// 将变量转换为对象,注意 pointer 参数必须为struct指针
|
|
|
|
|
|
func (s *Session) GetStruct(key string, pointer interface{}, mapping...map[string]string) error {
|
|
|
|
|
|
return gconv.Struct(s.Get(key), pointer, mapping...)
|
2019-02-25 23:08:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|