在實際的項目開發中,我們會經常有業務場景使用到Session功能。在iris框架中,也為我們提供了方便使用,功能齊全的Session模塊。Session模塊的源碼目錄為kataras/iris/sessions包。
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的操作和使用相關的內容。在后面的實際項目開發中,我們本節課學習的內容將會得到應用實踐的機會。