在实际的项目开发中,我们会经常有业务场景使用到Session功能。在iis框架中,也为我们提供了方便使用,功能齐全的Session模块。Session模块的源码目录为kataras/iris/sessions包。
Session与Cookiel的区别
session和cookie的区别:
·首先是两者的相同点。session
和cookie
两者都是用来存储客户的状态信息的手段。在登录
、注 册
等动作后,可以存储相关账户的状态信息,方便程序后续跟踪及使用。
·其次是不同点,讨论两者的不同点我们从几个角度来总结。首先是两者的存储位置。Cookie
是
存储在客户端浏览器上,方便客户端请求时使用;Session
存储的相关信息存储在服务器端,用
于存储客户端连接的状态信息。
·其次,从可以存储的数据类型来看。Cookie
仅仅支持存储字符串string一种数据类型,Session
支持int、string、bool等多种数据类型,Session支持的数据类型更全更多。
示例
先要安装session库
go get github.com/kataras/iris/v12/session
package main
import (
"github.com/kataras/iris/v12"
"github.com/kataras/iris/v12/sessions"
)
func main() {
app := iris.New()
sessionID := "mySession"
//1.创建session并进行使用
sess := sessions.New(sessions.Config{
Cookie: sessionID,
})
app.Get("/", func(ctx iris.Context) {
ctx.Text("你好")
})
app.Post("/login", func(ctx iris.Context) {
name := ctx.PostValue("name")
passwd := ctx.PostValue("pwd")
if name == "admin" && passwd == "123456" {
session := sess.Start(ctx)
session.Set("username", name)
session.Set("isLogin", true)
ctx.JSON(iris.Map{
"islogin": session.Get(ISLOGIN),
"name": name,
"pwd": passwd,
})
} else {
session := sess.Start(ctx)
session.Set("isLogin", false)
ctx.JSON(iris.Map{
"islogin": session.Get(ISLOGIN),
"name": name,
"pwd": passwd,
})
}
})
app.Run(iris.Addr(":8088"))
}
退出登录(session删除)
//session.Delete(session-name)
app.Get("/quite",func(ctx iris.Context){
session := sess.Start(ctx)
session.Delete("islogin")
session.Delete("username")
})
查询
app.Get("/query",func(ctx iris.Context){
session := sess.Start(ctx)
//判断是否登录
isLogin,err := session.GetBoolean("islogin")
if err != nil {
ctx.WriteString("账号未登录,请先登录")
return
}
if isLogin {
ctx.WriteString("账号已登陆")
}else{
ctx.WriteString("账号未登陆")
}
})
session连接数据库
有些时候后端服务重启维护的时候,用户的信息应该保存下来,我们应该恢复session状态,以前都是保存在本地内存中,需要保存下来就需要用到session数据库(boltdb
:键值对的数据库)
go get github.com/kataras/iris/v12/sessions/sessiondb/boltdb@v12.2.5
//"github.com/kataras/iris/v12/sessions/sessiondb/boltdb"
//session与数据库通讯
db, err := boltdb.New("sessions.db", 0600)
if err != nil {
panic(err.Error())
}
//程序中断时,数据库关闭
iris.RegisterOnInterrupt(func() {
defer db.Close()
})
sess.UseDatabase(db)