golang cookie与session

前端之家收集整理的这篇文章主要介绍了golang cookie与session前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

main

  1. // main project main.go
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "html/template"
  7. "log"
  8. "net/http"
  9. "strings"
  10. "session"
  11. _"memory"
  12. "time"
  13. )
  14.  
  15. func sayHelloName(w http.ResponseWriter,r *http.Request) {
  16. r.ParseForm()
  17. fmt.Println(r.Form)
  18. fmt.Println(r.URL.Path)
  19. fmt.Println(r.URL.Scheme)
  20. fmt.Println(r.Form["url_long"])
  21. for k,v := range r.Form {
  22. fmt.Println("key: ",k)
  23. fmt.Println("value:",strings.Join(v,""))
  24. }
  25. fmt.Fprintln(w,"hello nihao")
  26.  
  27. }
  28.  
  29. func login(w http.ResponseWriter,r *http.Request) {
  30. r.ParseForm()
  31. fmt.Println("method: ",r.Method)
  32. if r.Method == "GET" {
  33. t,err := template.ParseFiles("src/html/login.gtpl")
  34. if err != nil {
  35. fmt.Println(err)
  36. return
  37. }
  38. t.Execute(w,nil)
  39.  
  40. } else {
  41. fmt.Println("username: ",r.Form["username"])
  42. fmt.Println("password: ",r.Form["password"])
  43. }
  44. }
  45. func login2(w http.ResponseWriter,r *http.Request) {
  46. sess := globalSessions.SessionStart(w,r)
  47. r.ParseForm()
  48. if r.Method == "GET" {
  49. t,_ := template.ParseFiles("src/html/login.gtpl")
  50. //w.Header().Set("Content-Type","text/html")
  51. t.Execute(w,sess.Get("username"))
  52. } else {
  53. sess.Set("username",r.Form["username"])
  54. http.Redirect(w,r,"/",302)
  55. }
  56. }
  57.  
  58. func count(w http.ResponseWriter,r)
  59. createtime := sess.Get("createtime")
  60. if createtime == nil {
  61. sess.Set("createtime",time.Now().Unix())
  62. } else if (createtime.(int64) + 360) < (time.Now().Unix()) {
  63. globalSessions.SessionDestroy(w,r)
  64. sess = globalSessions.SessionStart(w,r)
  65. }
  66. ct := sess.Get("countnum")
  67. if ct == nil {
  68. sess.Set("countnum",1)
  69. } else {
  70. sess.Set("countnum",(ct.(int) + 1))
  71. }
  72. t,_ := template.ParseFiles("count.gtpl")
  73. w.Header().Set("Content-Type","text/html")
  74. t.Execute(w,sess.Get("countnum"))
  75. }
  76. func main() {
  77. //http.HandleFunc("/",sayHelloName);
  78. http.HandleFunc("/login",login)
  79. http.HandleFunc("/login2",login2)
  80. err := http.ListenAndServe(":9090",nil)
  81. if err != nil {
  82. log.Fatalf("Listen and server",err)
  83. }
  84. }
  85. var globalSessions *session.Manager
  86.  
  87. func init() {
  88. globalSessions,_ = session.NewSessionManager("memory","goSessionid",3600)
  89. go globalSessions.GC()
  90. fmt.Println("fd")
  91. }

session
  1. package session
  2.  
  3. import (
  4. "crypto/rand"
  5. "encoding/base64"
  6. "fmt"
  7. "io"
  8. "net/http"
  9. "net/url"
  10. "sync"
  11. "time"
  12. )
  13.  
  14. type Manager struct {
  15. cookieName string
  16. lock sync.Mutex
  17. provider Provider
  18. maxLifeTime int64
  19. }
  20.  
  21. type Provider interface {
  22. SessionInit(sid string) (Session,error)
  23. SessionRead(sid string) (Session,error)
  24. SessionDestroy(sid string) error
  25. SessionGC(maxLifeTime int64)
  26. }
  27.  
  28. type Session interface {
  29. Set(key,value interface{}) error
  30. Get(key interface{}) interface{}
  31. Delete(ket interface{}) error
  32. SessionID() string
  33. }
  34.  
  35. func NewSessionManager(provideName,cookieName string,maxLifeTime int64) (*Manager,error) {
  36. provide,ok := provides[provideName]
  37. if !ok {
  38. return nil,fmt.Errorf("session: unknown provide %q (forgotten import?",provideName)
  39. }
  40. return &Manager{cookieName: cookieName,provider: provide,maxLifeTime: maxLifeTime},nil
  41. }
  42.  
  43. func Register(name string,provide Provider) {
  44. if provide == nil {
  45. panic("session: Register provide is nil")
  46. }
  47. if _,dup := provides[name]; dup {
  48. panic("session: Register called twice for provide " + name)
  49. }
  50. provides[name] = provide
  51. }
  52.  
  53. var provides = make(map[string]Provider)
  54.  
  55. func (manager *Manager) sessionId() string {
  56. b := make([]byte,32)
  57. if _,err := io.ReadFull(rand.Reader,b); err != nil {
  58. return ""
  59. }
  60. return base64.URLEncoding.EncodeToString(b)
  61. }
  62.  
  63. func (manager *Manager) SessionStart(w http.ResponseWriter,r *http.Request) (session Session) {
  64. manager.lock.Lock()
  65. defer manager.lock.Unlock()
  66. cookie,err := r.Cookie(manager.cookieName)
  67. if err != nil || cookie.Value == "" {
  68. sid := manager.sessionId()
  69. session,_ = manager.provider.SessionInit(sid)
  70. cookie := http.Cookie{Name: manager.cookieName,Value: url.QueryEscape(sid),Path: "/",HttpOnly: true,MaxAge: int(manager.maxLifeTime)}
  71. http.SetCookie(w,&cookie)
  72. } else {
  73. sid,_ := url.QueryUnescape(cookie.Value)
  74. session,_ = manager.provider.SessionRead(sid)
  75. }
  76. return session
  77. }
  78. func (manager *Manager) SessionDestroy(w http.ResponseWriter,r *http.Request){
  79. cookie,err := r.Cookie(manager.cookieName)
  80. if err != nil || cookie.Value == "" {
  81. return
  82. } else {
  83. manager.lock.Lock()
  84. defer manager.lock.Unlock()
  85. manager.provider.SessionDestroy(cookie.Value)
  86. expiration := time.Now()
  87. cookie := http.Cookie{Name: manager.cookieName,Expires: expiration,MaxAge: -1}
  88. http.SetCookie(w,&cookie)
  89. }
  90. }
  91.  
  92. func (manager *Manager) GC() {
  93. manager.lock.Lock()
  94. defer manager.lock.Unlock()
  95. manager.provider.SessionGC(manager.maxLifeTime)
  96. time.AfterFunc(time.Duration(manager.maxLifeTime),func(){ manager.GC() })
  97. }

memory
  1. package memory
  2.  
  3. import (
  4. "container/list"
  5. "time"
  6. "sync"
  7. "fmt"
  8. "session"
  9. )
  10.  
  11. type SessionStore struct {
  12. sid string //session id 唯一标示
  13. timeAccessed time.Time //最后访问时间
  14. value map[interface{}]interface{} //session 里面存储的值
  15. }
  16.  
  17. func (st *SessionStore) Set(key,value interface{}) error {
  18. st.value[key] = value
  19. pder.SessionUpdate(st.sid)
  20. return nil
  21. }
  22. func (st *SessionStore) Get(key interface{}) interface{} {
  23. pder.SessionUpdate(st.sid)
  24. if v,ok := st.value[key]; ok {
  25. return v
  26. } else {
  27. return nil
  28. }
  29. return nil
  30. }
  31. func (st *SessionStore) Delete(key interface{}) error {
  32. delete(st.value,key)
  33. pder.SessionUpdate(st.sid)
  34. return nil
  35. }
  36. func (st *SessionStore) SessionID() string {
  37. return st.sid
  38. }
  39.  
  40.  
  41. type Provider struct {
  42. lock sync.Mutex //用来锁
  43. sessions map[string]*list.Element //用来存储在内存
  44. list *list.List //用来做 gc
  45. }
  46.  
  47. func (provider *Provider) SessionInit(sid string) (session.Session,error) {
  48. provider.lock.Lock()
  49. defer provider.lock.Unlock()
  50. v := make(map[interface{}]interface{},0)
  51. newsess := &SessionStore{sid: sid,timeAccessed: time.Now(),value: v}
  52. element := provider.list.PushBack(newsess)
  53. provider.sessions[sid] = element
  54. return newsess,nil
  55. }
  56.  
  57. func (provider *Provider) SessionRead(sid string) (session.Session,error) {
  58. if element,ok := provider.sessions[sid]; ok {
  59. return element.Value.(*SessionStore),nil
  60. } else {
  61. sess,err := provider.SessionInit(sid)
  62. return sess,err
  63. }
  64. return nil,nil
  65. }
  66.  
  67. func (provider *Provider) SessionDestroy(sid string) error {
  68. if element,ok := provider.sessions[sid]; ok {
  69. delete(provider.sessions,sid)
  70. provider.list.Remove(element)
  71. return nil
  72. }
  73. return nil
  74. }
  75.  
  76. func (provider *Provider) SessionGC(maxLifeTime int64) {
  77. provider.lock.Lock()
  78. defer provider.lock.Unlock()
  79. for {
  80. element := provider.list.Back()
  81. if element == nil {
  82. break
  83. }
  84. if (element.Value.(*SessionStore).timeAccessed.Unix() + maxLifeTime) <
  85. time.Now().Unix() {
  86. provider.list.Remove(element)
  87. delete(provider.sessions,element.Value.(*SessionStore).sid)
  88. } else {
  89. break
  90. }
  91. }
  92. }
  93. func (provider *Provider) SessionUpdate(sid string) error {
  94. provider.lock.Lock()
  95. defer provider.lock.Unlock()
  96. if element,ok := provider.sessions[sid]; ok {
  97. element.Value.(*SessionStore).timeAccessed = time.Now()
  98. provider.list.MoveToFront(element)
  99. return nil
  100. }
  101. return nil
  102. }
  103.  
  104. var pder = &Provider{list: list.New()}
  105.  
  106. func init() {
  107. pder.sessions = make(map[string]*list.Element,0)
  108. session.Register("memory",pder)
  109. fmt.Println("wzz")
  110. }

猜你在找的Go相关文章