扫码订阅《 》或入驻星球,即可阅读文章!

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
author-avatar

GOLANG ROADMAP


首页
Go友会
  • 城市
  • 校园
Go学院
  • Go小课
  • Go小考
  • Go实战
  • 精品课
Go求职
  • 求职辅导🔥
  • Offer收割社群
  • 企业题库
  • 面试宝典
Go宝典
  • 在线宝典
  • B站精选
  • 推荐图书
  • 每日博文
Go仓库
实验区
  • Go周边
  • Go下载
  • Go月刊
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
  • Go语言Web编程

    • 课程介绍
  • Web基础

  • 表单

  • 访问数据库

  • session和数据存储

  • 文本处理

  • Web服务

  • 安全与加密

  • 国际化和本地化

  • 错误处理,调试和测试

  • 部署与维护

  • 如何设计一个Web框架

  • 扩展Web框架

    • 第1节:扩展 Web 框架
    • 第2节: 静态文件支持
    • 第3节:Session 支持
    • 第4节:表单及验证支持
    • 第5节:用户认证
    • 第6节:多语言支持
    • 第7节:pprof 支持
    • 第8节:小结

扫码订阅《 》或入驻星球,即可阅读文章!

第3节:Session 支持


ASTA谢

前面章节我们介绍过如何在 Go 语言中使用 session,也实现了一个 sessionManger,beego 框架基于 sessionManager 实现了方便的 session 处理功能。

# session 集成

beego 中主要有以下的全局变量来控制 session 处理:

// related to session 
SessionOn            bool   // 是否开启 session 模块,默认不开启
SessionProvider      string // session 后端提供处理模块,默认是 sessionManager 支持的 memory
SessionName          string // 客户端保存的 cookies 的名称
SessionGCMaxLifetime int64  // cookies有效期

GlobalSessions *session.Manager // 全局session控制器
1
2
3
4
5
6
7

当然上面这些变量需要初始化值,也可以按照下面的代码来配合配置文件以设置这些值:

if ar, err := AppConfig.Bool("sessionon"); err != nil {
	SessionOn = false
} else {
	SessionOn = ar
}
if ar := AppConfig.String("sessionprovider"); ar == "" {
	SessionProvider = "memory"
} else {
	SessionProvider = ar
}
if ar := AppConfig.String("sessionname"); ar == "" {
	SessionName = "beegosessionID"
} else {
	SessionName = ar
}
if ar, err := AppConfig.Int("sessiongcmaxlifetime"); err != nil && ar != 0 {
	int64val, _ := strconv.ParseInt(strconv.Itoa(ar), 10, 64)
	SessionGCMaxLifetime = int64val
} else {
	SessionGCMaxLifetime = 3600
}	
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

在 beego.Run 函数中增加如下代码:

if SessionOn {
	GlobalSessions, _ = session.NewManager(SessionProvider, SessionName, SessionGCMaxLifetime)
	go GlobalSessions.GC()
}
1
2
3
4

这样只要 SessionOn 设置为 true,那么就会默认开启 session 功能,独立开一个 goroutine 来处理 session。

为了方便我们在自定义 Controller 中快速使用 session,作者在 beego.Controller 中提供了如下方法:

func (c *Controller) StartSession() (sess session.Session) {
	sess = GlobalSessions.SessionStart(c.Ctx.ResponseWriter, c.Ctx.Request)
	return
}		
1
2
3
4

# session 使用

通过上面的代码我们可以看到,beego 框架简单地继承了 session 功能,那么在项目中如何使用呢?

首先我们需要在应用的 main 入口处开启 session:

beego.SessionOn = true
1

然后我们就可以在控制器的相应方法中如下所示的使用 session了:

func (this *MainController) Get() {
	var intcount int
	sess := this.StartSession()
	count := sess.Get("count")
	if count == nil {
		intcount = 0
	} else {
		intcount = count.(int)
	}
	intcount = intcount + 1
	sess.Set("count", intcount)
	this.Data["Username"] = "astaxie"
	this.Data["Email"] = "astaxie@gmail.com"
	this.Data["Count"] = intcount
	this.TplNames = "index.tpl"
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

上面的代码展示了如何在控制逻辑中使用 session,主要分两个步骤:

  1. 获取 session 对象
	// 获取对象, 类似 PHP 中的 session_start()
	sess := this.StartSession()
1
2
  1. 使用 session 进行一般的 session 值操作
	// 获取 session 值,类似 PHP 中的 $_SESSION["count"]
	sess.Get("count")
	
	// 设置 session 值
	sess.Set("count", intcount)
1
2
3
4
5

从上面代码可以看出基于 beego 框架开发的应用中使用 session 相当方便,基本上和 PHP 中调用 session_start() 类似。

  • session 集成
  • session 使用