在實際的專案開發中,我們會經常有業務場景使用到Session功能。在iris框架中,也為我們提供了方便使用,功能齊全的Session模組。Session模組的原始碼目錄為kataras/iris/sessions包。
Session與Cookie的區別
在學習web開發過程中,我們總會和session和cookie打交道。本節課我們學習sesion相關的知識,因此有必要先通過講解對比一下session和cookie的區別:
首先是兩者的相同點。session和cookie兩者都是用來儲存客戶的狀態資訊的手段。在登入、註冊等動作後,可以儲存相關賬戶的狀態資訊,方便程式後續跟蹤及使用。
其次是不同點,討論兩者的不同點我們從幾個角度來總結。首先是兩者的儲存位置。Cookie是儲存在客戶端瀏覽器上,方便客戶端請求時使用;Session儲存的相關資訊儲存在伺服器端,用於儲存客戶端連線的狀態資訊。
其次,從可以儲存的資料型別來看。Cookie僅僅支援儲存字串string一種資料型別,Session支援int、string、bool等多種資料型別,Session支援的資料型別更全更多。
Session物件建立
在實際的程式開發中,iris框架中可以非常方便的建立一個新的session物件。如下所示,即是session的建立:
...
sessionID := "mySession"
//session的建立
sess := sessions.New(sessions.Config{
Cookie: sessionID,
})複製程式碼
支援的資料型別
在上文中,我們說過session支援的資料型別要比cookie多,我們來看一下iris框架中的session所支援儲存的資料型別:
//String:字串型別
session.GetString()
//Int:無符號整形 及系列相關單位的同型別
session.GetInt()
//Boolean:布林值型別
session.GetBoolean()
//Float:單精度數值型別 及系列相關單位的同型別
session.GetFloat()
//interface{}:介面 即任意資料結構型別
session.GetFlash()複製程式碼
上述程式碼塊,即列出了iris框架中所支援儲存的資料型別。我們在接下來的本節課程內容中,將會演示如何進行具體使用。
Session的儲存和使用
在實際的專案開發中,Session的用法非常普遍。在本節課堂中,我們通過一個模擬使用者登入、登出、查詢的案例來模擬Session的儲存、使用、刪除等操作。
具體案例如下:
app.Post("/login", func(context context.Context) {
path := context.Path()
app.Logger().Info(" 請求Path:", path)
userName := context.PostValue("name")
passwd := context.PostValue("pwd")
if userName == "davie" && passwd == "pwd123" {
session := sess.Start(context)
//使用者名稱
session.Set(USERNAME, userName)
//登入狀態
session.Set(ISLOGIN, true)
context.WriteString("賬戶登入成功 ")
} else {
session := sess.Start(context)
session.Set(ISLOGIN, false)
context.WriteString("賬戶登入失敗,請重新嘗試")
}
})
...
app.Get("/logout", func(context context.Context) {
path := context.Path()
app.Logger().Info(" 退出登入 Path :", path)
session := sess.Start(context)
//刪除session
session.Delete(ISLOGIN)
session.Delete(USERNAME)
context.WriteString("退出登入成功")
})
...
app.Get("/query", func(context context.Context) {
path := context.Path()
app.Logger().Info(" 查詢資訊 path :", path)
session := sess.Start(context)
isLogin, err := session.GetBoolean(ISLOGIN)
if err != nil {
context.WriteString("賬戶未登入,請先登入 ")
return
}
if isLogin {
app.Logger().Info(" 賬戶已登入 ")
context.WriteString("賬戶已登入")
} else {
app.Logger().Info(" 賬戶未登入 ")
context.WriteString("賬戶未登入")
}
})
...複製程式碼
上述的程式碼中展示了session的使用方法,更多全部的案例程式碼資料在配套的課程資料中可以檢視。
Session與資料庫結合使用
除了Session在程式中的使用,Session還可以與資料庫繫結使用,用以在停止服務時將使用者狀態session同步於資料庫中,並進行恢復。
db, err := boltdb.New("sessions.db", 0600)
if err != nil {
panic(err.Error())
}
//程式中斷時,將資料庫關閉
iris.RegisterOnInterrupt(func() {
defer db.Close()
})
//session和db繫結
sess.UseDatabase(db)複製程式碼
本節課中,我們學習了Session的操作和使用相關的內容。在後面的實際專案開發中,我們本節課學習的內容將會得到應用實踐的機會。