3. Session的使用和控制
在實際的項目開發中,我們會經常有業務場景使用到Session功能。在iris框架中,也為我們提供了方便使用,功能齊全的Session模塊。Session模塊的源碼目錄為kataras/iris/sessions包。
3.1 Session與Cookie的區別
在學習web開發過程中,我們總會和session和cookie打交道。本節課我們學習sesion相關的知識,因此有必要先通過講解對比一下session和cookie的區別:
-
首先是兩者的相同點。session和cookie兩者都是用來存儲客戶的狀態信息的手段。在登錄、注冊等動作后,可以存儲相關賬戶的狀態信息,方便程序后續跟蹤及使用。
-
其次是不同點,討論兩者的不同點我們從幾個角度來總結。首先是兩者的存儲位置。Cookie是存儲在客戶端瀏覽器上,方便客戶端請求時使用;Session存儲的相關信息存儲在服務器端,用於存儲客戶端連接的狀態信息。
-
其次,從可以存儲的數據類型來看。Cookie僅僅支持存儲字符串string一種數據類型,Session支持int、string、bool等多種數據類型,Session支持的數據類型更全更多。
3.2 Session對象創建
在實際的程序開發中,iris框架中可以非常方便的創建一個新的session對象。如下所示,即是session的創建:
sessionID := "mySession" //session的創建 sess := sessions.New(sessions.Config{ Cookie: sessionID, })
3.3 支持的數據類型
在上文中,我們說過session支持的數據類型要比cookie多,我們來看一下iris框架中的session所支持存儲的數據類型:
//String:字符串類型 session.GetString() //Int:無符號整形 及系列相關單位的同類型 session.GetInt() //Boolean:布爾值類型 session.GetBoolean() //Float:單精度數值類型 及系列相關單位的同類型 session.GetFloat() //interface{}:接口 即任意數據結構類型 session.GetFlash()
上述代碼塊,即列出了iris框架中所支持存儲的數據類型。我們在接下來的本節課程內容中,將會演示如何進行具體使用。
3.4 Session的使用
session := sess.Start(ctx) session.Set("key", "helloworld")
4. 實戰項目資源導入和項目框架搭建
從本節內容開始,我們將利用我們所學習的Iris框架的相關知識,進行實戰項目開發。
4.1 實戰項目框架搭建
我們的實戰項目是使用Iris框架開發一個關於本地服務平台的后台管理平台。平台中可以管理用戶、商品、商鋪等相關的信息,平台可以實時展示用戶、商品等相關監測數據的變化情況。通過此項目,旨在能夠將Iris框架相關的知識得到鞏固和練習。 如下是項目框架搭建后的說明:
-
config:項目配置文件及讀取配置文件的相關功能
-
controller:控制器目錄、項目各個模塊的控制器及業務邏輯處理的所在目錄
-
datasource:實現mysql連接和操作、封裝操作mysql數據庫的目錄。
-
model:數據實體目錄,主要是項目中各業務模塊的實體對象的定義
-
service:服務層目錄。用於各個模塊的基礎功能接口定義及實現,是各個模塊的數據層。
-
static:配置項目的靜態資源目錄。
-
util:提供通用的方法封裝。
-
main.go:項目程序主入口
-
config.json:項目配置文件。
5. 代碼
package main import ( "github.com/kataras/iris/sessions" "github.com/kataras/iris" "github.com/kataras/iris/context" "github.com/kataras/iris/sessions/sessiondb/boltdb" ) var ( USERNAME = "userName" ISLOGIN = "isLogin" ) //Session的使用和控制 func main() { app := iris.New() sessionID := "mySession" //1.創建session並進行使用 sess := sessions.New(sessions.Config{ Cookie: sessionID, }) //用戶登錄功能 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("賬戶未登錄") } }) //2.session和db綁定使用 //boltdb鍵值對的輸數據庫 db, err := boltdb.New("sessions.db", 0600) //0600操作權限 if err != nil { panic(err.Error()) } //程序中斷時,將數據庫關閉 iris.RegisterOnInterrupt(func() { defer db.Close() }) //session和db綁定 sess.UseDatabase(db) app.Run(iris.Addr(":8009"), iris.WithoutServerError(iris.ErrServerClosed)) }