2 回答

TA貢獻1804條經驗 獲得超2個贊
作為提出另一個問題的人:
gorilla/context 允許您在請求中存儲數據。如果您有一些中間件在決定繼續之前對請求進行一些預處理(即反 CSRF),您可能希望在請求中存儲一個令牌,以便您的處理程序可以將其傳遞給模板。該大猩猩/背景文檔解釋得好:
...路由器可以設置從 URL 中提取的變量,以后的應用程序處理程序可以訪問這些值,或者它可以用于存儲會話值以在請求結束時保存。還有其他幾種常見用途。
您可能還需要在會話數據存儲:錯誤消息從表單提交,用戶ID,或者“規范”令牌為游客可能會被存儲在這里的CSRF的版本。如果您嘗試在請求上下文中存儲錯誤消息,然后重定向用戶,您將丟失它(這是一個新請求)。
那么為什么要在會話上使用上下文呢?它更輕巧,并允許您將應用程序的各個部分(通常是 HTTP 中間件?。┍舜朔蛛x。
例子:
請求進來
CSRF 中間件檢查會話中是否存在現有的 CSRF 令牌。不存在,所以設置一個。
它還將此新令牌(通過請求上下文!)傳遞給呈現表單的處理程序,以便它可以在模板中呈現它(否則您將不得不再次從會話中提取令牌,這是白費力氣)
請求完成。
表單提交的新請求
該令牌仍保留在會話中,因此我們可以將其與表單中提交的令牌進行比較。
如果檢查出來,我們繼續處理表格
如果沒有,我們可以在會話中保存一個錯誤(一條閃現消息;即讀取后刪除的消息)并重新定向。
這個重定向是一個新的請求,因此我們不能通過這里的請求上下文傳遞錯誤消息。

TA貢獻1847條經驗 獲得超7個贊
一個例子。
我正在編寫這個多社區論壇軟件?,F在我有一個為主域提供不同內容的 gorilla/mux 路由器和另一個為 subdomain.domain.tld 過濾的不同內容提供服務的路由器。
上下文在這里非常有用,否則你會一遍又一遍地重復自己。因此,如果我知道對于子域路由器,每個請求都會執行字符串操作以找出子域名并檢查它是否存在于數據庫中,我可以在此處(在上下文中)為每個請求執行此操作,然后將子域名存儲在上下文變量。同樣,如果將論壇的類別 slug 或論壇 slug 或線程 slug 設置為將其傳遞給處理程序,請將需要在“上下文”中完成的處理保留在處理程序中并減少代碼。
所以上下文的優勢本質上是保持代碼干燥。
就像 elihrar 寫的那樣,他的 CSRF 令牌示例。如果您知道需要在每個請求上檢查 CSRF 令牌 - 不要在需要執行此操作的每個處理程序中重復此檢查,而是編寫上下文包裝器 (/http.Handler) 并為每個請求執行此操作。
- 2 回答
- 0 關注
- 280 瀏覽
添加回答
舉報