使用 session 访问计数
同数据库接口一样,Go官方也只提供了Session标准接口,并未提供官方实现。本文用iris框架自带的session管理器,实现一个简单访问计数器,以演示session在Iris框架mvc应用内的呈现,全文代码量不超50行。
流程
框架应用为基础,MVC应用依赖框架应用扩展而成,控制器实例注册在MVC应用上。绑定在MVC应用上的依赖项,可被MVC应用下的多个控制器所共享,当然控制器也可自行绑定依赖,自定义依赖项。
- .创建app应用,session管理器实例
- 生成 mvc应用实例,定义根路由
- 定义控制器结构体及其方法
- 绑定mvc应用依赖,注册访问控制器,隐式生成相应的路由
- 测试
控制器
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 协议》,转载必须注明作者和本文链接