亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

gorilla/context 與 gorilla/sessions 有什么不同?

gorilla/context 與 gorilla/sessions 有什么不同?

Go
烙印99 2021-07-12 15:52:30
我得到會話,來自我曾經使用過的 PHP<?phpsession_start();$_SESSION["key"] = "val";echo $_SESSION["key"];?>在服務器端設置一個或多個鍵及其值,并能夠檢索或覆蓋它,直到會話過期。與 gorilla/sessions 相同var(    sessionStore  *sessions.CookieStore    sessionSecret []byte = make([]byte, 64)    session       *sessions.Session)func init(){    sessionSecret = []byte("12345678901234567890123456789012")    sessionStore = sessions.NewCookieStore(sessionSecret)    session = sessions.NewSession(sessionStore, "session_name")}func SetSessionHandler(w http.ResponseWriter, r *http.Request) {    session, _ = sessionStore.Get(r, "session_name")    session.Values["key"] = "val"    session.Save(r, w)}func GetSessionHandler(w http.ResponseWriter, r *http.Request) {    session, _ = sessionStore.Get(r, "session_name")    fmt.FPrintln(session.Values["key"])}現在我不明白大猩猩/上下文的意義是什么。我知道上下文是什么,但是......我不知道它如何適應大局。它說它綁定到當前請求。stackoverflow 上的另一個問題是,在Writing Per-Handler Middleware的上下文中,“僅使用 gorilla/context 就足夠了” 。但是如果它是請求綁定的...... err.. 語法錯誤,不計算。如果鴨子浮在水面上,那么巫婆就是用木頭做的。而且因為鴨子也浮在水面上,如果她的體重和鴨子一樣,她一定是個女巫。或類似的東西 ;)當它受請求限制時,它如何作為中間件“管理器”有用,我無法全局設置它。您能否舉例說明如何將大猩猩/會話與大猩猩/上下文一起使用?
查看完整描述

2 回答

?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

作為提出另一個問題的人:

  • gorilla/context 允許您在請求中存儲數據。如果您有一些中間件在決定繼續之前對請求進行一些預處理(即反 CSRF),您可能希望在請求中存儲一個令牌,以便您的處理程序可以將其傳遞給模板。該大猩猩/背景文檔解釋得好

...路由器可以設置從 URL 中提取的變量,以后的應用程序處理程序可以訪問這些值,或者它可以用于存儲會話值以在請求結束時保存。還有其他幾種常見用途。

  • 您可能需要在會話數據存儲:錯誤消息從表單提交,用戶ID,或者“規范”令牌為游客可能會被存儲在這里的CSRF的版本。如果您嘗試在請求上下文中存儲錯誤消息,然后重定向用戶,您將丟失它(這是一個新請求)。

那么為什么要在會話上使用上下文呢?它更輕巧,并允許您將應用程序的各個部分(通常是 HTTP 中間件?。┍舜朔蛛x。

例子:

  1. 請求進來

  2. CSRF 中間件檢查會話中是否存在現有的 CSRF 令牌。不存在,所以設置一個。

  3. 它還將此新令牌(通過請求上下文!)傳遞給呈現表單的處理程序,以便它可以在模板中呈現它(否則您將不得不再次從會話中提取令牌,這是白費力氣)

  4. 請求完成。

  5. 表單提交的新請求

  6. 該令牌仍保留在會話中,因此我們可以將其與表單中提交的令牌進行比較。

  7. 如果檢查出來,我們繼續處理表格

  8. 如果沒有,我們可以在會話中保存一個錯誤(一條閃現消息;即讀取后刪除的消息)并重新定向。

  9. 這個重定向是一個新的請求,因此我們不能通過這里的請求上下文傳遞錯誤消息。


查看完整回答
反對 回復 2021-07-12
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

一個例子。

我正在編寫這個多社區論壇軟件?,F在我有一個為主域提供不同內容的 gorilla/mux 路由器和另一個為 subdomain.domain.tld 過濾的不同內容提供服務的路由器。

上下文在這里非常有用,否則你會一遍又一遍地重復自己。因此,如果我知道對于子域路由器,每個請求都會執行字符串操作以找出子域名并檢查它是否存在于數據庫中,我可以在此處(在上下文中)為每個請求執行此操作,然后將子域名存儲在上下文變量。同樣,如果將論壇的類別 slug 或論壇 slug 或線程 slug 設置為將其傳遞給處理程序,請將需要在“上下文”中完成的處理保留在處理程序中并減少代碼。

所以上下文的優勢本質上是保持代碼干燥。

就像 elihrar 寫的那樣,他的 CSRF 令牌示例。如果您知道需要在每個請求上檢查 CSRF 令牌 - 不要在需要執行此操作的每個處理程序中重復此檢查,而是編寫上下文包裝器 (/http.Handler) 并為每個請求執行此操作。


查看完整回答
反對 回復 2021-07-12
  • 2 回答
  • 0 關注
  • 280 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號