使用 session 访问计数

同数据库接口一样,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 秒内
pardon110
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!