使用 session 訪問計數

pardon110發表於2019-10-31

同資料庫介面一樣,Go官方也只提供了Session標準介面,並未提供官方實現。本文用iris框架自帶的session管理器,實現一個簡單訪問計數器,以演示session在Iris框架mvc應用內的呈現,全文程式碼量不超50行。

流程

框架應用為基礎,MVC應用依賴框架應用擴充套件而成,控制器例項註冊在MVC應用上。繫結在MVC應用上的依賴項,可被MVC應用下的多個控制器所共享,當然控制器也可自行繫結依賴,自定義依賴項。

  1. .建立app應用,session管理器例項
  2. 生成 mvc應用例項,定義根路由
  3. 定義控制器結構體及其方法
  4. 繫結mvc應用依賴,註冊訪問控制器,隱式生成相應的路由
  5. 測試

控制器

VisitController 結構體欄位,又稱依賴集,可為任意型別。
通常接收的入參為context返回單值函式型別,由該控制器自行解析,稱之為動態繫結。

// VisitController handlers
type VisitController struct {
    Session   *sessions.Session
    StartTime time.Time
}

// Get handles
// Method: GET
// Path: http://localhost:8080
func (c *VisitController) Get() string {
    visits := c.Session.Increment("visits", 1)
    since := time.Now().Sub(c.StartTime).Seconds()
    return fmt.Sprintf("訪問 %d 次 當前session上線 %0.1f 秒內", visits, since)
}

建立應用

visitApp.Register 內會繫結依賴到MVC應用上,若依賴值為,可接收Context型別入參且返回單值的函式型別,那麼該函式將被當前控制器解析(呼叫)。每次請求進入控制器,控制器將會自動呼叫帶Context引數的依賴函式,並將計算結果給予對應返回值型別的欄位,在此sess.Start 函式值對應為欄位*sessions.Session。如果依賴集無欄位或依賴欄位被用作函式的入參,那麼這些依賴將在伺服器執行之前被忽略。

故mvc應用上繫結多個依賴值,可在其下不同的控制器內使用。

func newApp() *iris.Application {
    app := iris.New()
    sess := sessions.New(sessions.Config{Cookie: "mysession_cookie_name"})
    visitApp := mvc.New(app.Party("/"))

    // 繫結 *session.Session 到 `VisitController.Session`,time.Now() 到 `VisitController.StartTime` 欄位
    visitApp.Register(
        sess.Start,    // 函式型別 動態繫結 被控制器自動呼叫解析
        time.Now(),
    )

    // 註冊控制器,並隱式生成相應路由
    visitApp.Handle(new(VisitController))

    return app
}

測試

1. 開啟瀏覽器
2. 訪問 http://localhost:8080
3. 重新整理頁面
4. 關閉瀏覽器
5. 重開瀏覽器 重複步驟2

package main

import (
    "fmt"
    "time"

    "github.com/kataras/iris"
    "github.com/kataras/iris/mvc"
    "github.com/kataras/iris/sessions"
)
//...

func main() {
    app := newApp()
    app.Run(iris.Addr(":8080"))
}

效果

go run build main.go

編譯執行,依前節流程測試訪問瀏覽器,形如下

訪問 13 次 當前session上線 32.7 秒內
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章