manager.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package httpsession
  2. import (
  3. "log"
  4. "net/http"
  5. "sync"
  6. "time"
  7. )
  8. const (
  9. DefaultMaxAge = 30 * time.Minute
  10. )
  11. var Domain string = ""
  12. type Manager struct {
  13. store Store
  14. maxAge time.Duration
  15. Path string
  16. generator IdGenerator
  17. transfer Transfer
  18. beforeReleaseListeners map[BeforeReleaseListener]bool
  19. afterCreatedListeners map[AfterCreatedListener]bool
  20. lock sync.Mutex
  21. }
  22. func Default() *Manager {
  23. log.Println("IsRedisSessionStore", IsRedisSessionStore)
  24. if IsRedisSessionStore {
  25. store := NewRedisStore(DefaultMaxAge)
  26. key := string(GenRandKey(16))
  27. return NewManager(store,
  28. NewSha1Generator(key),
  29. NewCookieTransfer("SESSIONID", DefaultMaxAge, false, "/", Domain))
  30. } else {
  31. store := NewMemoryStore(DefaultMaxAge)
  32. key := string(GenRandKey(16))
  33. return NewManager(store,
  34. NewSha1Generator(key),
  35. NewCookieTransfer("SESSIONID", DefaultMaxAge, false, "/", Domain))
  36. }
  37. }
  38. func NewManager(store Store, gen IdGenerator, transfer Transfer) *Manager {
  39. return &Manager{
  40. store: store,
  41. generator: gen,
  42. transfer: transfer,
  43. }
  44. }
  45. func (manager *Manager) SetMaxAge(maxAge time.Duration) {
  46. manager.maxAge = maxAge
  47. manager.transfer.SetMaxAge(maxAge)
  48. manager.store.SetMaxAge(maxAge)
  49. }
  50. func (manager *Manager) Session(req *http.Request, rw http.ResponseWriter) *Session {
  51. manager.lock.Lock()
  52. defer manager.lock.Unlock()
  53. id, err := manager.transfer.Get(req)
  54. if err != nil {
  55. // TODO:
  56. println("error:", err.Error())
  57. return nil
  58. }
  59. if !manager.generator.IsValid(id) {
  60. id = manager.generator.Gen(req)
  61. manager.transfer.Set(req, rw, id)
  62. manager.store.Add(id)
  63. session := NewSession(id, manager.maxAge, manager)
  64. session.Set("Lock", &sync.Mutex{})
  65. // is exist?
  66. manager.afterCreated(session)
  67. return session
  68. } else {
  69. cookie, _ := req.Cookie(manager.transfer.(*CookieTransfer).Name)
  70. cookie.Path = "/"
  71. cookie.Secure = false
  72. cookie.Domain = manager.transfer.(*CookieTransfer).Domain
  73. cookie.MaxAge = int(manager.transfer.(*CookieTransfer).MaxAge / time.Second)
  74. http.SetCookie(rw, cookie)
  75. }
  76. session := NewSession(id, manager.maxAge, manager)
  77. // if session.Get("Lock") == nil {
  78. // session.Set("Lock", &sync.Mutex{})
  79. // }
  80. return session
  81. }
  82. func (manager *Manager) Invalidate(rw http.ResponseWriter, session *Session) {
  83. manager.beforeReleased(session)
  84. manager.store.Clear(session.id)
  85. manager.transfer.Clear(rw)
  86. }
  87. //add 2017-7-30
  88. func (manager *Manager) IsValidSession(id string) bool {
  89. return manager.store.Exist(Id(id))
  90. }
  91. func (manager *Manager) afterCreated(session *Session) {
  92. for listener, _ := range manager.afterCreatedListeners {
  93. listener.OnAfterCreated(session)
  94. }
  95. }
  96. func (manager *Manager) beforeReleased(session *Session) {
  97. for listener, _ := range manager.beforeReleaseListeners {
  98. listener.OnBeforeRelease(session)
  99. }
  100. }
  101. func (manager *Manager) Run() error {
  102. return manager.store.Run()
  103. }