- Cookie được dùng để lưu thông tin session. Cookie được lưu trên máy người dùng
// Tạo cookie store dùng để lưu session bên trong secure cookie
store := cookie.NewStore([]byte("tuananh"))
- Kiểm tra thông tin cookie được gửi lên từ client
// Method sessions.Sessions
func Sessions(name string, store Store) gin.HandlerFunc {
return func(c *gin.Context) {
s := &session{name, c.Request, store, nil, false, c.Writer}
c.Set(DefaultKey, s)
defer context.Clear(c.Request)
c.Next()
}
}
router.GET("/about", sessions.Sessions("hungdung", store), controller.AboutPage)
Khi có GET request gửi đến /about:
- Server tạo một struct lưu thông tin của cookie gửi lên (biến store)
- Struct này được lưu vào biến *c gin.Context
- Trong hàm AboutPage, lấy thông tin session từ biến *c gin.Context
func Default(c *gin.Context) Session {
return c.MustGet(DefaultKey).(Session)
}
session := sessions.Default(c)
type session struct {
name string
request *http.Request
store Store
session *sessions.Session
written bool
writer http.ResponseWriter
}
- Lấy value tương ứng với key count được lưu trong struct Session
// Session stores the values and optional configuration for a session.
type Session struct {
// The ID of the session, generated by stores. It should not be used for
// user data.
ID string
// Trường Values lưu các cặp key-value mà user set
Values map[interface{}]interface{}
Options *Options
IsNew bool
store Store
name string
}
session.Get("count").(type)
func (s *session) Get(key interface{}) interface{} {
return s.Session().Values[key]
}
func (s *session) Session() *sessions.Session {
if s.session == nil {
// Kiểm tra xem có phải lúc nào s.session cũng là nil ko --> YES, lúc nào nó cũng là nil
log.Println("Hello Cristaino Ronaldo")
var err error
// Method Get lấy thông tin struct Session được lưu trong registry
s.session, err = s.store.Get(s.request, s.name)
// Sau khi lấy thông tin session theo name, kiểm tra xem đây là session cũ hay mới
// --> lần đầu tiên s.session.IsNew = true, các lần sau đều là false
log.Println("Biến IsNew của session:", s.session.IsNew)
if err != nil {
log.Printf(errorFormat, err)
}
}
return s.session
}
- Kiểm tra cặp key-value được lưu ở trường Values của struct Session
switch v := session.Get("count").(type) {
case nil:
count = 0
// Lưu biến count vào key của trường Values của struct Session
session.Set("count", count)
session.Save()
case int:
count = v
count++
session.Set("count", count)
session.Save()
}
Như vậy, mỗi lần có GET request gửi đến /about:
- Server tạo một struct session lưu thông tin của cookie gửi lên
- Struct này được lưu vào biến *c gin.Context
- Trong hàm xử lý chính, lấy thông tin struct session từ biến *c gin.Context
- struct session gọi method Get(key) để lấy value và Set(key, value) để lưu dữ liệu mới vào Session