大猩猩/会话:在处理程序之间管理会话(持续更改)?

时间:2017-08-18 22:38:49

标签: session go gorilla

我用于Go会话管理:

"github.com/gorilla/sessions"

以下代码的问题是与CookieStore关联的会话未在处理程序之间共享,我需要它来执行此操作。

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

我已经验证会话在原始处理程序"/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
    }
}

1 个答案:

答案 0 :(得分:0)

我和我的网络服务器发生了同样的事情。我正在做你正在做的事情:

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
}

我创建了一个局部变量,以便存储检索到的会话值,然后键入断言值以确保它的完整性。我发现类型断言是静默失败的,因为gorilla / sessions.Session结构的Values字段属于map[interface{}]interface{}source)类型。从“值”字段中检索会话值时,就像在此处一样...

sval = sess.Values["authMode"]

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

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

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
}

我希望有所帮助!