session - gorilla / session : Session be managed (persist changes) between handlers?

标签 session go gorilla

我正在使用 Go session 管理:

"github.com/gorilla/sessions"

以下代码的问题在于,与 CookieStore 关联的 session 未在处理程序之间共享,我需要它这样做。

处理程序 "/authorize" 将值保存到 session 中,然后重定向到另一个处理程序 "/thankyou",但该处理程序在 session 中看不到该值.

我已验证 session 在原始处理程序 "/authorize" 中确实具有新值。

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

var (
    cookieStore *sessions.CookieStore
    storeGUID   string
    sessionGUID string
)

func init() {
    storeGUID = "{random-string}"
    sessionGUID = "{random-string}"
    cookieStore = sessions.NewCookieStore([]byte(storeGUID))
}

mux.HandleFunc("/authorize", func(w http.ResponseWriter, r *http.Request) {
    var sess *sessions.Session
    sess, err := cookieStore.Get(r, sessionGUID)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    sess.Values["authMode"] = "Authorized"

    if err := sess.Save(r, w); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    // Redirect to "/thankyou"
    authorizeURL := r.URL.String()
    thankyouRedirectURL := strings.Replace(authorizeURL, "authorize", "thankyou", 1)
    defer http.Redirect(w, r, thankyouRedirectURL, http.StatusFound)
}

mux.HandleFunc("/thankyou", func(w http.ResponseWriter, r *http.Request) {
    var sess *sessions.Session
    sess, err := cookieStore.Get(r, sessionGUID)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    var sval interface{}
    var authMode string

    sval = sess.Values["authMode"]
    if authMode, ok := sval.(string); !ok {
        err := errors.New("Missing \"authSess\" in session.")
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}

最佳答案

我的网络服务器遇到了同样的问题。我正在做你在这里做的事情:

sval = sess.Values["authMode"]
if authMode, ok := sval.(string); !ok {
    err := errors.New("Missing \"authSess\" in session.")
    http.Error(w, err.Error(), http.StatusInternalServerError)
    return
}

我创建了一个局部变量以存储检索到的 session 值,然后键入断言该值以确保其完整性。我发现类型断言悄无声息地失败了,因为 gorilla/sessions.Session 结构的 Values 字段是类型 map[interface{}]interface{} ( source )。从 Values 字段中检索 session 值时,就像您在此处所做的那样...

sval = sess.Values["authMode"]

...编译器认为 sval 现在是 interface{} 类型。因此,当您尝试键入 assert sval 时,它无法将接口(interface)转换为字符串。

我所做的是在我处理类型断言的 if block 上方创建一个变量声明,以便我以后可以使用它。然后,我使用 map 元素本身键入断言。这就是您的样子:

var authMode string // a var declaration with the type you want
var ok bool         // in my case, I also created a bool var to avoid a pointer error

// directly type assert the session value
if authMode, ok = sess.Values["authMode"].(string); !ok {
    err := errors.New("Missing \"authSess\" in session.")
    http.Error(w, err.Error(), http.StatusInternalServerError)
    return
}

希望对您有所帮助!

关于session - gorilla / session : Session be managed (persist changes) between handlers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45765891/

相关文章:

session - 没有 cookie 的 Node.JS session

java - 如何在 Android 上恢复 SSL session

session - Echo session 中间件不保存

java - session 管理遇到问题

java - 如何在 JSP、Java servlet 中显示当前登录的用户

algorithm - 是否有用于获取大整数的立方根的 Go 函数?

go - 使用 golang 服务静态文件

go - http.Handler 没有在 golang 中被调用

go - 如何使用 reflect.Type 执行类型断言

powershell - 如何在 Windows 上的 Go (golang) 中打印 UTF-8(或 unicode)字符