当前位置: 代码迷 >> 综合 >> 【GoCN酷Go推荐】会话控制利器 gorilla/sessions
  详细解决方案

【GoCN酷Go推荐】会话控制利器 gorilla/sessions

热度:76   发布时间:2023-12-06 01:09:02.0

推荐 gorilla/sessions 的背景

在日常 Web 应用开发过程中,需要对用户登录状态进行判断,而 HTTP 是无状态的,即不记录用户登录状态,想要得到用户登录状态得把登录状态保存下来,通常用户状态数据加密后用数据库或者缓存等手段把存储;原生的会话数据存储的 HTTP cookie 对数据大小有限制,不能写入太多太大的数据,又不能对存储的数据进行有效管理,而 gorilla/sessions 恰恰补充了原生回话控制的不足。

gorilla/sessions 简介

gorilla/sessions 支持原生的 HTTP cookie 会话数据存储和存储介质系统会话以及自定义会话等基础设施(Memcache/Redis/SQLite/MySQL )的支持应有尽有。

gorilla/sessions 提供了会话数据的加密解密,以及底层的 cookie 管理,提供的接口比较简单易用,gorilla/sessions 主要特点如下:

  • 简单的API:使用它作为设置签名(和可选的加密)cookie的简单方法。

  • 内置的后端可以在 cookie 或文件系统中存储会话。

  • Flash 信息:会话值持续到读取为止。

  • 切换会话持久性(又称 "记住我")和设置其他属性的方便方法。

  • 轮换认证和加密密钥的机制。

  • 每个请求有多个会话,甚至使用不同的后端。

  • 自定义会话后端的接口和基础设施:来自不同端的会话可以使用一个共同的API进行检索和批量保存。

gorilla/sessions 应用

下面是集成 gorilla/sessions 的简单会话控制业务代码段,如下:

import ("github.com/gorilla/sessions""net/http""os"
)// Store gorilla sessions 的存储库
var Store = sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))// Session 当前会话
var Session *sessions.Session// Request 用以获取会话
var Request *http.Request// Response 用以写入会话
var Response http.ResponseWriter// StartSession 初始化会话
func StartSession(w http.ResponseWriter, r *http.Request) {Store, _ := Store.Get(r, "session-name")// Set some session values.session.Values["foo"] = "bar"session.Values[42] = 43//外部可以这么设置//Set("foo","bar")//Set("age", 22)// Save it before we write to the response/return from the handler.session.Save(r, w)Request = rResponse = w//Save(Request, Response)
}// Set 写入键值对应的会话数据
func Set(key interface{}, value interface{}) {Session.Values[key] = valueSave()
}// Get 获取会话数据,获取数据时请做类型检测
func Get(key string) interface{} {return Session.Values[key]
}// Destroy 删除某个会话项
func Destroy(key string) {delete(Session.Values, key)Save()
}// Save 保持会话
func Save() {Session.Save(Request, Response)
}

注意:非 HTTPS 的链接无法使用 Secure 和 HttpOnly,浏览器会报错,因此非 HTTPS 要设置

Session.Options.Secure = true
Session.Options.HttpOnly = true

首先,初始化一个会话存储,调用 NewCookieStore() 并传递一个用于验证会话的秘密密钥。其次,在处理器中调用store.Get() 来检索一个现有的会话或创建一个新的会话,在 session.Values 中设置一些会话值,它是一个 map[interface{}]interface{} 。最后,我们调用session.Save()来保存响应中的会话。

值得注意的是,

  • 在生产代码中,应该在调用 session.Save(r, w) 时检查是否有错误,并显示错误信息或以其他方式处理。

  • 会话数据被存储在map[string]interface{}中,所以在检索数据时需要对其进行类型验证。

  • Save 必须在写入响应之前调用,否则会话 cookie 将不会被发送到客户端。

默认情况下,会话 cookies 持续一个月。这可能对有些情况来说可能太长了,但在运行时很容易改变cookies 持续时间和其他相关属性。会话可以被单独配置,也可以服务提供者哪里配置,然后所有使用它保存的会话都将使用该配置。具体地调用 session.Options 或 store.Options 来设置一个新的配置。

总结

gorilla/sessions 支持原生的 cookie 会话数据存储和文件系统会话以及自定义会话功能,可以在主流的 Go Web 框架或者自创的框架及应用上可以直接拿来就可以使用。

参考资料

  • https://github.com/gorilla/sessions

  • https://pkg.go.dev/github.com/gorilla/sessions#p-readme

还想了解更多吗?

更多请查看:https://github.com/gorilla/sessions

欢迎加入我们GOLANG中国社区:https://gocn.vip/

《酷Go推荐》招募:

各位Gopher同学,最近我们社区打算推出一个类似GoCN每日新闻的新栏目《酷Go推荐》,主要是每周推荐一个库或者好的项目,然后写一点这个库使用方法或者优点之类的,这样可以真正的帮助到大家能够学习到

新的库,并且知道怎么用。

大概规则和每日新闻类似,如果报名人多的话每个人一个月轮到一次,欢迎大家报名!(报名地址:https://wj.qq.com/s2/7734329/3f51)

扫码也可以加入 GoCN 的大家族哟~

  相关解决方案