【问题标题】:How to set session variable in golang gorilla framework?如何在 golang gorilla 框架中设置会话变量?
【发布时间】:2013-07-30 11:45:10
【问题描述】:

我下面的代码

package inqzincrm

import (
    "github.com/gorilla/pat"
    "github.com/gorilla/sessions"
    "net/http"
)

var store = sessions.NewCookieStore([]byte("X12h8v6BZC4QJl53KfNLshtr85gkC5OZ"), []byte("X12h8vasdf6BZC4QJl53KfNLshtr85gk"))

func init() {

    r := pat.New()
    r.Get("/", Home)

    http.Handle("/", r)
}

在处理程序中,

package inqzincrm

import (
    "appengine"
    "html/template"
    "net/http"
)

var aTmplt = template.Must(template.ParseFiles(
    "inqzincrm/templates/base.html",
    "inqzincrm/templates/index.html",
))

func Home(w http.ResponseWriter, r *http.Request) {
    c := appengine.NewContext(r)

    session, err := store.Get(r, "x")

    c.Infof("HOST: %s", r.Host)

    if session.IsNew {
        session.Options.Domain = r.Host
        session.Options.Path = "/"
        session.Options.MaxAge = 0
        session.Options.HttpOnly = false
        session.Options.Secure = false
    }

    if err != nil {
        c.Infof("Error getting session: %v", err)
    }
    c.Infof("Requested URL: %v", session.Values["foo"])
    session.Values["foo"] = "asdf"
    if err := aTmplt.ExecuteTemplate(w, "index.html", nil); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
    session.Save(r, w)
}

不要在浏览器端设置任何cookie。结果和错误如何为零表明功能没有问题。

我应该如何进一步调试?

我正在使用 Ubuntu 64 位、Google App Engine、Go with Gorilla 工具包。

【问题讨论】:

  • 删除 result := 并单独调用 session.Save(w, r)。您还需要设置 Store.Options — 特别是 Path 设置。

标签: google-app-engine session go session-cookies


【解决方案1】:

看看我对上一个问题here的回答。

简而言之:

import (
    "github.com/gorilla/sessions"
    "net/http"
)

// Authorization Key
var authKey = []byte("somesecret")

// Encryption Key
var encKey = []byte("someothersecret")

var store = sessions.NewCookieStore(authKey, encKey)

func initSession(r *http.Request) *sessions.Session {
    session, _ := store.Get(r, "my_cookie") // Don't ignore the error in real code
    if session.IsNew { //Set some cookie options
        session.Options.Domain = "example.org"
        session.Options.MaxAge = 0
        session.Options.HttpOnly = false
        session.Options.Secure = true
    }
    return session
}

然后,在您的处理程序中:

func ViewPageHandler(w http.ResponseWriter, r *http.Request) {
    session := initSession(r)
    session.Values["page"] = "view"
    session.Save(r, w)
....

你的代码似乎做同样的事情,所以没有更多的例子我看不出它有什么问题。我可以说我发布的示例是(非常稍作修改)来自工作服务器。

【讨论】:

  • 我在研究解决方案时注意到了您的帖子。这就是为什么我问我应该如何调试它?
  • 我感觉可能是session.Options.Domain中没有设置域名。出于安全原因,许多浏览器可能已经开始对此感到偏执。规范中有类似“如果未指定,它们默认为所请求对象的域和路径”之类的内容,但这对于现代浏览器来说可能还不够。不过只是猜测。
  • 在处理程序中尝试使用 session.Options = &sessions.Options{ Path: "/", Domain: "localhost:8080", }。没用。
  • 也许可以试试Domain: "localhost"。我不确定该端口是否包含在域中。
  • 对不起,我很难过,它看起来应该可以工作。如果我想到其他任何事情,我会及时通知您。
【解决方案2】:

代码 session.save() 应该在模板执行代码之前。它没有被提及。但这就是整个错误。

【讨论】:

  • 对。 cookie 通过响应写入浏览器,因此如果您在更新 cookie 时已经发送了响应,则浏览器永远不会看到它。
猜你喜欢
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2017-04-02
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多