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

时间:2013-12-06 03:21:56

标签: go gorilla

我得到的会话来自我以前的PHP

<?php
session_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的上下文中“简单地使用大猩猩/上下文就足够了”。

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

当它受到请求限制时,它如何作为中间件“管理器”有用,我无法在全局设置它。您是否可以举例说明大猩猩/会话如何与大猩猩/上下文一起使用?

2 个答案:

答案 0 :(得分:9)

作为提出其他问题的人:

  • gorilla / context允许您在请求中存储数据。如果您有一些中间件在决定继续之前对请求进行一些预处理(即反CSRF),您可能希望在请求中存储令牌,以便处理程序可以将其传递给模板。 gorilla/context documentation explains it well
  

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

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

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

示例:

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

答案 1 :(得分:0)

一个例子。

我正在撰写这个多社区论坛软件。 现在我有一个gorilla / mux路由器为主域提供不同的内容,另一个路由器提供由subdomain.domain.tld过滤的不同内容。

上下文在这里非常有用,否则你会一遍又一遍地重复自己。因此,如果我知道对于子域路由器,每个请求都会执行字符串操作以找出子域名并检查它是否存在于数据库中我可以在此处(在上下文中)为每个请求执行此操作,然后将子域名存储在上下文变量。 同样,如果设置了论坛的类别slug或论坛slug或者线程段塞,则将其传递给处理程序,保持需要在“上下文”中完成的处理,并在处理程序中使用较少的代码。

因此,上下文的优点主要是保持代码DRY。

像elihrar写的那样,他的CSRF令牌的例子。如果您知道需要在每个请求上检查CSRF令牌 - 请不要在每个需要执行此操作的处理程序中复制此检查,而是编写上下文包装器(/ http.Handler)并为每个请求执行此操作。 / p>