Skip to content

Latest commit

 

History

History
 
 

session-cookie-renew

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 

Sử dụng session cookie

  1. 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"))
  1. 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
  1. 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
}
  1. 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
}
  1. 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