1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【GoCN酷Go推薦】會(huì)話控制利器 gorilla/sessions

        共 3477字,需瀏覽 7分鐘

         ·

        2021-07-13 21:42

        推薦 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 的大家族喲~






        瀏覽 25
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91精品国产入口 | 你想看黄色一级大片99的 | 美国一级簧片 | 中日韩特黄A片免费视频 | 日本一卡二卡 | 嬷嬷刷花蒂哭喊h调教公主视频 | 加勒比HEZYO黑人专区 | 日本黄色网址大全 | 特黄60分钟免费看片 | 美女靠逼不要网 |