大猩猩/背景与大猩猩/会话有何不同?

9 go gorilla

我从以前的PHP获得会话

<?php
session_start();
$_SESSION["key"] = "val";
echo $_SESSION["key"];
?>
Run Code Online (Sandbox Code Playgroud)

在服务器端设置一个或多个密钥及其值,并能够检索或覆盖它,直到会话到期为止.

与大猩猩/会话相同

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"])
}
Run Code Online (Sandbox Code Playgroud)

现在我不明白大猩猩/背景的意义.我知道背景是什么但是......我不知道它是如何适应大局的.它说它受当前请求的约束.stackoverflow上的另一个问题是,在编写Per-Handler中间件的上下文中"简单地使用gorilla/context应该就足够了" .

但如果它的请求绑定...错误..语法错误,不计算.如果鸭子浮在水面上,那么巫婆就是用木头做的.因为如果她的重量与鸭子的重量相同,鸭子也漂浮在水面上,她必须是女巫.或类似的东西 ;)

当它受到请求约束时,它如何作为中间件"管理器"有用,我无法在全局设置它.您是否可以展示如何将大猩猩/会话与大猩猩/上下文一起使用的示例?

eli*_*rar 9

作为提出其他问题的人:

  • gorilla/context允许您在请求中存储数据.如果您有一些中间件在决定继续之前对请求进行一些预处理(即反CSRF),您可能希望在请求中存储令牌,以便您的处理程序可以将其传递给模板.该大猩猩/背景文档解释得好:

...路由器可以设置从URL中提取的变量,以后应用程序处理程序可以访问这些值,或者它可以用于存储在请求结束时保存的会话值.还有其他几种常见用途.

  • 您可能希望在会话中存储数据:来自表单提交的错误消息,用户ID或该访问者的CSRF令牌的"规范"版本可能会存储在此处.如果您尝试在请求上下文中存储错误消息,然后重定向用户,您将丢失它(这是一个新请求).

那你为什么要在会话中使用上下文呢?它更轻,并允许您将应用程序的某些部分(通常是HTTP中间件!)彼此分离.

例:

  1. 请求进来
  2. CSRF中间件检查会话以查找现有CSRF令牌.不存在,所以设置一个.
  3. 它还将此新令牌(通过请求上下文!)传递给呈现表单的处理程序,因此它可以在模板中呈现它(否则您将不得不再次从会话中提取令牌,这是浪费精力)
  4. 请求已完成.
  5. 表单提交的新请求
  6. 令牌仍然存在于会话中,因此我们可以将其与表单中提交的令牌进行比较.
  7. 如果它结账,我们继续处理表格
  8. 如果没有,我们可以在会话中保存错误(闪存消息;即读取后擦除的消息)并重定向.
  9. 此重定向是一个新请求,因此我们无法通过请求上下文传递错误消息.

  • 谢谢.我知道我们不应该发帖谢谢你,但我不在乎.感谢您抽出宝贵时间来解释它 (5认同)