跳至主要内容

[gin] gin-contrib/sessions 筆記

gin-contribute/sessions

安裝:

$ go get github.com/gin-contrib/sessions

範例程式碼

// https://pkg.go.dev/github.com/gin-contrib/sessions?tab=overview#cookie-based
// cookie-based
func main() {
r := gin.Default()
// 建立 store
store := cookie.NewStore([]byte("secret"))

// session 的名稱會在 browser 變成 cookie 的 key
r.Use(sessions.Sessions("mysession", store))

r.GET("/incr", func(c *gin.Context) {
// 從 ctx 中取出 session
session := sessions.Default(c)
var count int

// 取得 session 中的值
v := session.Get("count")
if v == nil {
count = 0
} else {
count = v.(int)
count++
}

// 設定 session 中的值(不會儲存)
session.Set("count", count)

// 儲存 session 中的值
session.Save()
c.JSON(200, gin.H{"count": count})
})
r.Run(":8000")
}

Multiple Sessions

// https://pkg.go.dev/github.com/gin-contrib/sessions?tab=overview#multiple-sessions
func main() {
r := gin.Default()

// 建立 store
store := cookie.NewStore([]byte("secret"))

// 建立多個 sessions name,browser 會有多個 cookie
// session name 會對應到 cookie 中的 key
sessionNames := []string{"foo", "bar"}
r.Use(sessions.SessionsMany(sessionNames, store))

r.GET("/hello", func(c *gin.Context) {
// 從 ctx 中取出 sessions,並分別取得 sessionFoo 和 sessionBar
sessionFoo := sessions.DefaultMany(c, "foo")
sessionBar := sessions.DefaultMany(c, "bar")

// 取得 sessionFoo 中的值
if sessionFoo.Get("hello") != "world!" {
// 設定 sessionFoo 中的值(不會儲存)
sessionFoo.Set("hello", "world!")
// 儲存 sessionFoo 中的值(不會儲存)
sessionFoo.Save()
}

if sessionBar.Get("hello") != "world?" {
sessionBar.Set("hello", "world?")
sessionBar.Save()
}

c.JSON(200, gin.H{
"foo": sessionFoo.Get("hello"),
"bar": sessionBar.Get("hello"),
})
})
r.Run(":8000")
}