【GoCN酷Go推薦】會(huì)話控制利器 gorilla/sessions
推薦 gorilla/sessions 的背景
在日常 Web 應(yīng)用開(kāi)發(fā)過(guò)程中,需要對(duì)用戶登錄狀態(tài)進(jìn)行判斷,而 HTTP 是無(wú)狀態(tài)的,即不記錄用戶登錄狀態(tài),想要得到用戶登錄狀態(tài)得把登錄狀態(tài)保存下來(lái),通常用戶狀態(tài)數(shù)據(jù)加密后用數(shù)據(jù)庫(kù)或者緩存等手段把存儲(chǔ);原生的會(huì)話數(shù)據(jù)存儲(chǔ)的 HTTP cookie 對(duì)數(shù)據(jù)大小有限制,不能寫(xiě)入太多太大的數(shù)據(jù),又不能對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行有效管理,而 gorilla/sessions 恰恰補(bǔ)充了原生回話控制的不足。
gorilla/sessions 簡(jiǎn)介
gorilla/sessions 支持原生的 HTTP cookie 會(huì)話數(shù)據(jù)存儲(chǔ)和存儲(chǔ)介質(zhì)系統(tǒng)會(huì)話以及自定義會(huì)話等基礎(chǔ)設(shè)施(Memcache/Redis/SQLite/MySQL )的支持應(yīng)有盡有。
gorilla/sessions 提供了會(huì)話數(shù)據(jù)的加密解密,以及底層的 cookie 管理,提供的接口比較簡(jiǎn)單易用,gorilla/sessions 主要特點(diǎn)如下:
簡(jiǎn)單的API:使用它作為設(shè)置簽名(和可選的加密)cookie的簡(jiǎn)單方法。 內(nèi)置的后端可以在 cookie 或文件系統(tǒng)中存儲(chǔ)會(huì)話。 Flash 信息:會(huì)話值持續(xù)到讀取為止。 切換會(huì)話持久性(又稱 "記住我")和設(shè)置其他屬性的方便方法。 輪換認(rèn)證和加密密鑰的機(jī)制。 每個(gè)請(qǐng)求有多個(gè)會(huì)話,甚至使用不同的后端。 自定義會(huì)話后端的接口和基礎(chǔ)設(shè)施:來(lái)自不同端的會(huì)話可以使用一個(gè)共同的API進(jìn)行檢索和批量保存。
gorilla/sessions 應(yīng)用
下面是集成 gorilla/sessions 的簡(jiǎn)單會(huì)話控制業(yè)務(wù)代碼段,如下:
import (
"github.com/gorilla/sessions"
"net/http"
"os"
)
// Store gorilla sessions 的存儲(chǔ)庫(kù)
var Store = sessions.NewCookieStore([]byte(os.Getenv("SESSION_KEY")))
// Session 當(dāng)前會(huì)話
var Session *sessions.Session
// Request 用以獲取會(huì)話
var Request *http.Request
// Response 用以寫(xiě)入會(huì)話
var Response http.ResponseWriter
// StartSession 初始化會(huì)話
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
//外部可以這么設(shè)置
//Set("foo","bar")
//Set("age", 22)
// Save it before we write to the response/return from the handler.
session.Save(r, w)
Request = r
Response = w
//Save(Request, Response)
}
// Set 寫(xiě)入鍵值對(duì)應(yīng)的會(huì)話數(shù)據(jù)
func Set(key interface{}, value interface{}) {
Session.Values[key] = value
Save()
}
// Get 獲取會(huì)話數(shù)據(jù),獲取數(shù)據(jù)時(shí)請(qǐng)做類型檢測(cè)
func Get(key string) interface{} {
return Session.Values[key]
}
// Destroy 刪除某個(gè)會(huì)話項(xiàng)
func Destroy(key string) {
delete(Session.Values, key)
Save()
}
// Save 保持會(huì)話
func Save() {
Session.Save(Request, Response)
}
注意:非 HTTPS 的鏈接無(wú)法使用 Secure 和 HttpOnly,瀏覽器會(huì)報(bào)錯(cuò),因此非 HTTPS 要設(shè)置
Session.Options.Secure = true
Session.Options.HttpOnly = true
首先,初始化一個(gè)會(huì)話存儲(chǔ),調(diào)用 NewCookieStore() 并傳遞一個(gè)用于驗(yàn)證會(huì)話的秘密密鑰。其次,在處理器中調(diào)用store.Get() 來(lái)檢索一個(gè)現(xiàn)有的會(huì)話或創(chuàng)建一個(gè)新的會(huì)話,在 session.Values 中設(shè)置一些會(huì)話值,它是一個(gè) map[interface{}]interface{} 。最后,我們調(diào)用session.Save()來(lái)保存響應(yīng)中的會(huì)話。
值得注意的是,
在生產(chǎn)代碼中,應(yīng)該在調(diào)用 session.Save(r, w) 時(shí)檢查是否有錯(cuò)誤,并顯示錯(cuò)誤信息或以其他方式處理。 會(huì)話數(shù)據(jù)被存儲(chǔ)在map[string]interface{}中,所以在檢索數(shù)據(jù)時(shí)需要對(duì)其進(jìn)行類型驗(yàn)證。 Save 必須在寫(xiě)入響應(yīng)之前調(diào)用,否則會(huì)話 cookie 將不會(huì)被發(fā)送到客戶端。
默認(rèn)情況下,會(huì)話 cookies 持續(xù)一個(gè)月。這可能對(duì)有些情況來(lái)說(shuō)可能太長(zhǎng)了,但在運(yùn)行時(shí)很容易改變cookies 持續(xù)時(shí)間和其他相關(guān)屬性。會(huì)話可以被單獨(dú)配置,也可以服務(wù)提供者哪里配置,然后所有使用它保存的會(huì)話都將使用該配置。具體地調(diào)用 session.Options 或 store.Options 來(lái)設(shè)置一個(gè)新的配置。
總結(jié)
gorilla/sessions 支持原生的 cookie 會(huì)話數(shù)據(jù)存儲(chǔ)和文件系統(tǒng)會(huì)話以及自定義會(huì)話功能,可以在主流的 Go Web 框架或者自創(chuàng)的框架及應(yīng)用上可以直接拿來(lái)就可以使用。
參考資料
https://github.com/gorilla/sessions https://pkg.go.dev/github.com/gorilla/sessions#section-readme
更多請(qǐng)查看:https://github.com/gorilla/sessions
歡迎加入我們GOLANG中國(guó)社區(qū):https://gocn.vip/
《酷Go推薦》招募:
各位Gopher同學(xué),最近我們社區(qū)打算推出一個(gè)類似GoCN每日新聞的新欄目《酷Go推薦》,主要是每周推薦一個(gè)庫(kù)或者好的項(xiàng)目,然后寫(xiě)一點(diǎn)這個(gè)庫(kù)使用方法或者優(yōu)點(diǎn)之類的,這樣可以真正的幫助到大家能夠?qū)W習(xí)到
新的庫(kù),并且知道怎么用。
大概規(guī)則和每日新聞?lì)愃?,如果?bào)名人多的話每個(gè)人一個(gè)月輪到一次,歡迎大家報(bào)名?。▓?bào)名地址:https://wj.qq.com/s2/7734329/3f51)
掃碼也可以加入 GoCN 的大家族喲~
