From aed07b824680152fe5f47a8be40624ca39e17c9b Mon Sep 17 00:00:00 2001 From: John Date: Mon, 11 Dec 2017 18:21:30 +0800 Subject: [PATCH] =?UTF-8?q?gsession=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/net/ghttp/http_controller.go | 25 ++++++- g/net/ghttp/http_server.go | 8 ++- g/net/gsession/gsession.go | 94 +++++++++++++++++++++++++++ geg/frame/mvc/controller/user/user.go | 3 +- geg/other/test.go | 2 + 5 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 g/net/gsession/gsession.go diff --git a/g/net/ghttp/http_controller.go b/g/net/ghttp/http_controller.go index f57a4af55..8a6c03192 100644 --- a/g/net/ghttp/http_controller.go +++ b/g/net/ghttp/http_controller.go @@ -1,5 +1,7 @@ package ghttp +import "gitee.com/johng/gf/g/net/gsession" + // 控制器基类 type Controller struct { @@ -13,4 +15,25 @@ func (c *Controller) Head(*ClientRequest, *ServerResponse) {} func (c *Controller) Patch(*ClientRequest, *ServerResponse) {} func (c *Controller) Connect(*ClientRequest, *ServerResponse) {} func (c *Controller) Options(*ClientRequest, *ServerResponse) {} -func (c *Controller) Trace(*ClientRequest, *ServerResponse) {} \ No newline at end of file +func (c *Controller) Trace(*ClientRequest, *ServerResponse) {} + +// 获取当前请求的session对象 +func (c *Controller) Session(r *ClientRequest, w *ServerResponse) *gsession.Session { + sessionid := "" + if r, err := r.Cookie("gfsessionid"); err == nil { + sessionid = r.Value + } else { + sessionid = gsession.Id() + } + return gsession.Get(sessionid) +} + +// 请求初始化时的回调函数 +func (c *Controller) __init(r *ClientRequest, w *ServerResponse) { + +} + +// 请求结束时的回调函数 +func (c *Controller) __shut(r *ClientRequest, w *ServerResponse) { + +} \ No newline at end of file diff --git a/g/net/ghttp/http_server.go b/g/net/ghttp/http_server.go index 2007ff326..98646f8b7 100644 --- a/g/net/ghttp/http_server.go +++ b/g/net/ghttp/http_server.go @@ -208,7 +208,7 @@ func (s *Server) handlerKey(domain, method, pattern string) string { func (s *Server) setHandler(domain, method, pattern string, handler HandlerFunc) { s.hmu.Lock() defer s.hmu.Unlock() - if method == gDEFAULT_METHOD { + if method == "all" { s.handlerMap[s.handlerKey(domain, "GET", pattern)] = handler s.handlerMap[s.handlerKey(domain, "PUT", pattern)] = handler s.handlerMap[s.handlerKey(domain, "POST", pattern)] = handler @@ -241,9 +241,13 @@ func (s *Server)BindHandler(pattern string, handler HandlerFunc) error { if s.status == 1 { return errors.New("server handlers cannot be changed while running") } + + s.hmu.Lock() + defer s.hmu.Unlock() + uri := "" domain := gDEFAULT_DOMAIN - method := gDEFAULT_METHOD + method := "all" result := strings.Split(pattern, "@") if len(result) > 1 { domain = result[1] diff --git a/g/net/gsession/gsession.go b/g/net/gsession/gsession.go new file mode 100644 index 000000000..44d2f8b86 --- /dev/null +++ b/g/net/gsession/gsession.go @@ -0,0 +1,94 @@ +package gsession + +import ( + "strconv" + "strings" + "gitee.com/johng/gf/g/os/gtime" + "gitee.com/johng/gf/g/util/grand" + "gitee.com/johng/gf/g/container/gmap" + "gitee.com/johng/gf/g/os/gcache" + "sync" +) + +const ( + DEFAULT_EXPIRE_TIME = 600 // 默认过期间隔(10分钟) +) + +// 单个session对象 +type Session struct { + mu sync.RWMutex // 并发安全互斥锁 + id string // sessionid + data *gmap.StringInterfaceMap // session数据 + expire int // 过期间隔(秒) +} + +// 生成一个唯一的sessionid字符串 +func Id() string { + return strings.ToUpper(strconv.FormatInt(gtime.Nanosecond(), 32) + grand.RandStr(3)) +} + +// 获取或者生成一个session对象 +func Get(sessionid string) *Session { + if r := gcache.Get(cacheKey(sessionid)); r != nil { + return r.(*Session) + } + s := &Session{ + data : gmap.NewStringInterfaceMap(), + expire : DEFAULT_EXPIRE_TIME, + } + s.updateExpire() + return s +} + +// session在gache中的缓存键名 +func cacheKey(sessionid string) string { + return "session_" + sessionid +} + +// 获取sessionid +func (s *Session) Id () string { + s.mu.RLock() + defer s.mu.RUnlock() + id := s.id + s.updateExpire() + return id +} + +// 获取当前session所有数据 +func (s *Session) Data () map[string]interface{} { + m := *s.data.Clone() + s.updateExpire() + return m +} + +// 设置session过期间隔 +func (s *Session) SetExpire (expire int) { + s.mu.Lock() + defer s.mu.Unlock() + s.expire = expire + s.updateExpire() +} + +// 设置session +func (s *Session) Set (k string, v interface{}) { + s.data.Set(k, v) + s.updateExpire() +} + +// 获取session +func (s *Session) Get (k string) interface{} { + r := s.data.Get(k) + s.updateExpire() + return r +} + +// 删除session +func (s *Session) Remove (k string) { + s.data.Remove(k) + s.updateExpire() +} + +// 更新过期时间 +func (s *Session) updateExpire() { + gcache.Set(cacheKey(s.id), s, int64(s.expire*1000)) +} diff --git a/geg/frame/mvc/controller/user/user.go b/geg/frame/mvc/controller/user/user.go index 0eabe379a..81d3cd525 100644 --- a/geg/frame/mvc/controller/user/user.go +++ b/geg/frame/mvc/controller/user/user.go @@ -2,10 +2,10 @@ package user import ( "gitee.com/johng/gf/g/net/ghttp" - "gitee.com/johng/gf/g/frame/mvc" "html/template" "fmt" "gitee.com/johng/gf/g/os/gfile" + "gitee.com/johng/gf/g/frame/gmvc" ) // 定义业务相关的控制器对象 @@ -25,6 +25,7 @@ func init() { // 定义操作逻辑 func (cu *Controller_User) Info(r *ghttp.ClientRequest, w *ghttp.ServerResponse) { + r.c //w.Write([]byte("user information page")) t, err := template.New("test").Funcs(template.FuncMap{"add": Add}).Parse(gfile.GetContents("/home/john/Workspace/Go/GOPATH/src/gitee.com/johng/gf/geg/frame/mvc/view/user/info.tpl")) if err != nil { diff --git a/geg/other/test.go b/geg/other/test.go index e1781029e..4fa303675 100644 --- a/geg/other/test.go +++ b/geg/other/test.go @@ -3,6 +3,7 @@ import ( "time" "fmt" "gitee.com/johng/gf/g/frame/gmvc" + "gitee.com/johng/gf/g/net/gsession" ) type User struct { Username, Password string @@ -12,6 +13,7 @@ func add(i1, i2 int) int { return i1 + i2 + 1 } func main() { + fmt.Println(gsession.Id()) view := gmvc.NewView("/home/john/Workspace/Go/GOPATH/src/gitee.com/johng/gf/geg/frame/mvc/view/user/") tpl, _ := view.Template("info") tpl.BindFunc("add", add)