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

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go学习
  • Go学院

    • Go小课
    • Go小考
    • Go实战
    • 精品课
  • Go宝典

    • 在线宝典
    • B站精选
    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
  • Go下载

    • 视频资源
    • 文档资源
Go求职
  • 求职服务

    • 内推互助
    • 求职助力
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
Go友会
  • 城市
  • 校园
推广返利 🤑
实验区
  • Go周边
消息
更多
  • 用户中心

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

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

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

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

GOLANG ROADMAP


首页
Go学习
  • Go学院

    • Go小课
    • Go小考
    • Go实战
    • 精品课
  • Go宝典

    • 在线宝典
    • B站精选
    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
  • Go下载

    • 视频资源
    • 文档资源
Go求职
  • 求职服务

    • 内推互助
    • 求职助力
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
Go友会
  • 城市
  • 校园
推广返利 🤑
实验区
  • Go周边
消息
更多
  • 用户中心

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

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

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

    • 渠道合作
    • 课程入驻
    • 友情链接
  • beego简介

  • beego安装升级

  • 快速入门

  • beego的MVC架构-介绍

  • beego的MVC架构-model设计

  • beego的MVC架构-view设计

  • beego的MVC架构-controller设置

  • beego的模块设计

    • beego的模块设计
    • session模块
    • gracemokuai
    • cache模块
    • logs模块
    • httplib模块
    • toolbox模块
    • context模块
    • config模块
    • i18n模块
  • beego高级编程

  • 应用部署

  • beego第三方库

  • 应用例子

  • beego实用库

  • 其他

  • FAQ

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

session模块


beego官网

# 特别注意

这个文档是 session 独立模块,即你单独拿这个模块应用于其他应用中,如果你想在 beego 中使用 session,请查看文档session 控制

# session 介绍

session 模块是用来存储客户端用户,session 模块目前只支持 cookie 方式的请求,如果客户端不支持 cookie,那么就无法使用该模块。

session 模块参考了 database/sql 的引擎写法,采用了一个接口,多个实现的方式。目前实现了 memory、file、Redis 和 MySQL 四种存储引擎。

通过下面的方式安装 session:

go get github.com/astaxie/beego/session
1

# session 使用

首先你必须导入包:

import ( 
    "github.com/astaxie/beego/session"
)
1
2
3

然后你初始化一个全局的变量用来存储 session 控制器:

var globalSessions *session.Manager
1

接着在你的入口函数中初始化数据:

ffunc init() {
        sessionConfig := &session.ManagerConfig{
    CookieName:"gosessionid", 
    EnableSetCookie: true, 
    Gclifetime:3600,
    Maxlifetime: 3600, 
    Secure: false,
    CookieLifeTime: 3600,
    ProviderConfig: "./tmp",
    }
    globalSessions, _ = session.NewManager("memory",sessionConfig)
    go globalSessions.GC()
}
1
2
3
4
5
6
7
8
9
10
11
12
13

NewManager 函数的参数的函数如下所示

  1. 引擎名字,可以是 memory、file、mysql 或 redis。
  2. 一个 JSON 字符串,传入 Manager 的配置信息
    1. cookieName: 客户端存储 cookie 的名字。
    2. enableSetCookie,omitempty: 是否开启 SetCookie,omitempty 这个设置
    3. gclifetime: 触发 GC 的时间。
    4. maxLifetime: 服务器端存储的数据的过期时间
    5. secure: 是否开启 HTTPS,在 cookie 设置的时候有 cookie.Secure 设置。
    6. sessionIDHashFunc: sessionID 生产的函数,默认是 sha1 算法。
    7. sessionIDHashKey: hash 算法中的 key。
    8. cookieLifeTime: 客户端存储的 cookie 的时间,默认值是 0,即浏览器生命周期。
    9. providerConfig: 配置信息,根据不同的引擎设置不同的配置信息,详细的配置请看下面的引擎设置

最后我们的业务逻辑处理函数中可以这样调用:

func login(w http.ResponseWriter, r *http.Request) {
    sess, _ := globalSessions.SessionStart(w, r)
    defer sess.SessionRelease(w)
    username := sess.Get("username")
    if r.Method == "GET" {
        t, _ := template.ParseFiles("login.gtpl")
        t.Execute(w, nil)
    } else {
        sess.Set("username", r.Form["username"])
    }
}
1
2
3
4
5
6
7
8
9
10
11

globalSessions 有多个函数如下所示:

  • SessionStart 根据当前请求返回 session 对象
  • SessionDestroy 销毁当前 session 对象
  • SessionRegenerateId 重新生成 sessionID
  • GetActiveSession 获取当前活跃的 session 用户
  • SetHashFunc 设置 sessionID 生成的函数
  • SetSecure 设置是否开启 cookie 的 Secure 设置

返回的 session 对象是一个 Interface,包含下面的方法

  • Set(key, value interface{}) error
  • Get(key interface{}) interface{}
  • Delete(key interface{}) error
  • SessionID() string
  • SessionRelease()
  • Flush() error

# 引擎设置

上面已经展示了 memory 的设置,接下来我们看一下其他三种引擎的设置方式:

  • mysql

    其他参数一样,只是第四个参数配置设置如下所示,详细的配置请参考 mysql (opens new window):

      username:password@protocol(address)/dbname?param=value
    
    1
  • redis

    配置文件信息如下所示,表示链接的地址,连接池,访问密码,没有保持为空:

      127.0.0.1:6379,100,astaxie
    
    1
  • file

    配置文件如下所示,表示需要保存的目录,默认是两级目录新建文件,例如 sessionID 是 xsnkjklkjjkh27hjh78908,那么目录文件应该是 ./tmp/x/s/xsnkjklkjjkh27hjh78908:

      ./tmp
    
    1

# 如何创建自己的引擎

在开发应用中,你可能需要实现自己的 session 引擎,beego 的这个 session 模块设计的时候就是采用了 interface,所以你可以根据接口实现任意的引擎,例如 memcache 的引擎。

type SessionStore interface {
    Set(key, value interface{}) error //set session value
    Get(key interface{}) interface{}  //get session value
    Delete(key interface{}) error     //delete session value
    SessionID() string                //back current sessionID
    SessionRelease()                  // release the resource & save data to provider
    Flush() error                     //delete all data
}
type Provider interface {
    SessionInit(maxlifetime int64, savePath string) error
    SessionRead(sid string) (SessionStore, error)
    SessionExist(sid string) bool
    SessionRegenerate(oldsid, sid string) (SessionStore, error)
    SessionDestroy(sid string) error
    SessionAll() int //get all active session
    SessionGC()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

最后需要注册自己写的引擎:

func init() {   
    Register("own", ownadaper)
}
1
2
3
  • 特别注意
  • session 介绍
  • session 使用
  • 引擎设置
  • 如何创建自己的引擎