1. Session
1.1 什么是session
Session的英文意思是会议,在Beego里面用于会话控制。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
通常session实现机制都是在客户端放一个session ID (cookie),然后服务端存储一份session数据与之对应。服务端存储Session的位置可以自由决定,一般有:
- 内存
- cookie
- 文件
- mysql
- redis
1.2 session的基本配置
beego默认不会开启session,所以要先打开,这一步一定要做。
sessionon = true
然后设置session id的名字,这个通常都是保存在客户端cookie里面。
sessionname = "beegosessionID"
此外我们还可以设置session的过期时间和session id(一般保存在cookie中)的过期时间(默认都是3600秒)
sessiongcmaxlifetime = 3600
SessionCookieLifeTime = 3600
1.3 session的例子
我们一个简单的控制器函数:
func (this *MainController) Get() {
// 读取session数据
v := this.GetSession("count")
if v == nil {
// 写入session数据
this.SetSession("count", int(1))
this.Data["num"] = 0
} else {
// 写入session数据
this.SetSession("count", v.(int)+1)
this.Data["num"] = v.(int)
}
this.TplName = "index.html"
}
其中.(int)
是只有对接口对象才能执行类型动态转换,在模板中写:
<body>
<h1>访问次数:</h1>
<p>
{{ if .num}}
已经访问了:{{.num}} 次!
{{else}}
还没有访问!
{{end}}
</p>
</body>
只要我们访问localhost:8080/register
,就会统计次数,每次刷新都会增加次数。
除此之外,session还有很多其他读写函数:
- ·
SetSession(name string, value interface{})
- 设置session值 GetSession(name string) interface{}
- 读取session值DelSession(name string)
- 删除指定session值SessionRegenerateID()
- 生成新的session idDestroySession()
- 销毁session
1.4 配置session的存储引擎
前面提到的session引擎,默认是内存,这一节介绍其他的存储方法。
(1)文件存储
# 设置session保存到文件中
sessionprovider = "file"
# session数据保存目录
sessionproviderconfig = "./data/session"
(2)mysql存储
首先还是要mysql驱动,
go get github.com/astaxie/beego/session/redis
然后在main.go入口导入redis驱动:
import _ "github.com/astaxie/beego/session/redis"
然后
# 设置session存储引擎
sessionprovider = "mysql"
# mysql存储引擎配置
sessionproviderconfig = "root:123456@tcp(localhost:3306)/tizi365?charset=utf8"
mysql配置格式是:username:password@protocol(address)/dbname?param=value。
(3)redis存储
将session数据保存到redis中,需要先安装redis驱动,然后在main.go文件中导入redis驱动。
配置:
# 设置session存储引擎
sessionprovider = "redis"
# redis存储引擎配置
# redis配置格式: redis地址,redis连接池最大连接数,redis密码
# redis连接池和redis密码配置,没有保持为空,例子:127.0.0.1:6379
sessionproviderconfig = "127.0.0.1:6379,1000,123456"
安装redis驱动:
go get github.com/astaxie/beego/session/redis
在main.go入口文件,导入redis驱动
import _ "github.com/astaxie/beego/session/redis"
2. 日志
前导工作:
go get github.com/astaxie/beego/logs //安装
import ( //导入
"github.com/astaxie/beego/logs"
)
然后需要设置日志级别:
// debug级别
logs.SetLevel(logs.LevelDebug)
下面是常用的日志级别: 由高到底,高于当前日志级别的日志不展示。
- LevelDebug - 对应数字 7
- LevelInfo - 对应数字 6
- LevelWarn - 对应数字 4
- LevelError - 对应数字 3
然后是日志输出到文件的配置:
logs.SetLogger("file", `{"filename":"app.log", "level":6}`)
第二个参数是一个map,可以选用的配置有:
参数名 | 说明 |
---|---|
filename | 日志文件名 |
maxlines | 每个文件保存的最大行数,默认值 1000000 |
maxsize | 每个文件保存的最大尺寸,默认值是 1 << 28, //256 MB |
daily | 是否按照每天 logrotate,默认是 true |
maxdays | 文件最多保存多少天,默认保存 7 天 |
rotate | 是否开启 logrotate,默认是 true |
level | 日志保存的时候的级别,默认是 Trace 级别 |
perm | 日志文件权限 |
最后是调用不同的日志级别在文件中打印日志:
logs.Debug("这是一条debug日志, 后面是参数 ", 2019,2018)
logs.Info("携带参数1: %s, 参数2: %d", "tizi365", 2019)
logs.Warn("可以直接打印map类型数据 ", map[string]int{"key": 2019})
logs.Error("参数1", "参数2", "后面可以加入任意参数")
输出日志:
2019/06/30 18:38:23.075 [D] [main.go:29] tizi365 这是一条debug日志, 后面是参数 2019 2018
2019/06/30 18:38:23.149 [I] [main.go:29] tizi365 携带参数1: tizi365, 参数2: 2019
2019/06/30 18:38:23.149 [W] [main.go:29] tizi365 可以直接打印map类型数据 map[key:2019]
2019/06/30 18:38:23.149 [E] [main.go:29] tizi365 参数1 参数2 后面可以加入任意参数