cookie管理(1)
来源:互联网 发布:平板 win10 知乎 2017 编辑:程序博客网 时间:2024/06/16 14:40
Manager的主体
package sessionimport ( "fmt" "log" "net/http" "net/url" "sync" "time")type Manager struct { cookieName string lock sync.Mutex provider Provider maxlifetime int64}var ( provides map[string]Provider = make(map[string]Provider))func RegisterProvider(name string, provider Provider) { if nil == provider { panic("session: Register provider is nil") } if _, dup := provides[name]; dup { panic("session: Register called twice for provider " + name) } provides[name] = provider}func NewManager(providerName string, cookieName string, maxlifetime int64) (*Manager, error) { provider, ok := provides[providerName] if !ok { return nil, fmt.Errorf("sessions: unknown provider %q (forgotten import?)", providerName) } return &Manager{ provider: provider, cookieName: cookieName, maxlifetime: maxlifetime, }, nil}var doStartGC sync.Oncefunc (manager *Manager) DoStartGC() { doStartGC.Do(func() { manager.doGC() })}func (manager *Manager) doGC() { manager.lock.Lock() defer manager.lock.Unlock() log.Println("manager gc ...") manager.provider.SessionGC(manager.maxlifetime) log.Println("manager gc done") time.AfterFunc(time.Duration(manager.maxlifetime)*time.Millisecond, func() { manager.doGC() })}func (manager *Manager) SessionStart(writer http.ResponseWriter, req *http.Request) (session Session) { manager.lock.Lock() defer manager.lock.Unlock() cookie, err := req.Cookie(manager.cookieName) if err != nil || cookie.Value == "" { sid := makeSessionId() session, _ = manager.provider.SessionInit(sid) http.SetCookie( writer, &http.Cookie{ Name: manager.cookieName, Value: url.QueryEscape(sid), Path: "/", HttpOnly: true, MaxAge: int(manager.maxlifetime), }, ) return } sid, _ := url.QueryUnescape(cookie.Value) session, _ = manager.provider.SessionRead(sid) //log.Printf("Using old session <%v>", sid) return}func (manager *Manager) SessionDestroy(writer http.ResponseWriter, req *http.Request) { cookie, err := req.Cookie(manager.cookieName) if err != nil || cookie.Value == "" { return } manager.lock.Lock() defer manager.lock.Unlock() manager.provider.SessionDestroy(cookie.Value) http.SetCookie( writer, &http.Cookie{ Name: manager.cookieName, Path: "/", HttpOnly: true, Expires: time.Now(), MaxAge: -1, }, )}
类别定义
package sessiontype Provider interface { SessionInit(sid string) (Session, error) SessionRead(sid string) (Session, error) SessionDestroy(sid string) error SessionGC(maxlifetime int64)}type Session interface { Set(key, value interface{}) error Get(key interface{}) interface{} Delete(key interface{}) error GetString(key SessionID() string}
以及生成sessionid的方式:
package sessionimport ( "crypto/rand" "encoding/base64" "io" "log")func makeSessionId() string { b := make([]byte, 32) if _, err := io.ReadFull(rand.Reader, b); err != nil { log.Println("abnormal rand read for generating session-id") return "" } return base64.URLEncoding.EncodeToString(b)}
参考文章:
https://astaxie.gitbooks.io/build-web-application-with-golang/content/en/06.1.html
阅读全文
0 0
- cookie管理(1)
- cookie管理
- Cookie管理
- codeigniter 管理cookie创建cookie修改cookie删除cookie
- 插件69:管理cookie
- 会话 (cookie)管理
- 会话管理 Cookie
- Cookie会话管理
- Cookie会话管理
- 会话管理COOKIE
- Phalcon Cookie管理
- struts 管理cookie
- 玩具javascript:cookie管理
- 状态管理-Cookie
- httpclient 自己管理cookie
- 状态管理-Cookie
- PHP Cookie管理
- chrome cookie管理
- Java文件读写工具类封装
- LeetCode 461 Hamming Distance 汉明距离
- 软件工程(C编码实践篇) 第二次作业实验报告
- 【 2017 ACM-ICPC 亚洲区(西安赛区)网络赛】C. Sum
- 一 eclipse Spark 本地开发调试环境
- cookie管理(1)
- Androidg 改变CheckBox下的选中与未选中图片
- 通达OA2017最新版20170905程序加密锁无限制直供
- Html中的meta详解
- 【mongodb】mongodb中的skip指的是什么
- hdu 1358 & hdu 3746 & poj 2406 & uva 12012 循环节与kmp
- SpringBoot学习笔记之JSP与freemarker支持
- android图表库MPAndroidChart之分组柱状图的里面的坑
- equals()与hashCode()