go語言web開發框架_Iris框架講解(六):Session的使用和控制

qfDavie發表於2019-03-29

在實際的專案開發中,我們會經常有業務場景使用到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的操作和使用相關的內容。在後面的實際專案開發中,我們本節課學習的內容將會得到應用實踐的機會。


相關文章