Iris_cookie和session


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))
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM