为了账号安全,请及时绑定邮箱和手机立即绑定

无法通过键获取大猩猩会话值

无法通过键获取大猩猩会话值

Go
qq_遁去的一_1 2021-09-13 14:49:21
我无法通过这种方式从会话中获得价值,它是nil:session := initSession(r)valWithOutType := session.Values[key]完整代码:package mainimport (    "fmt"    "github.com/gorilla/mux"    "github.com/gorilla/sessions"    "log"    "net/http")func main() {    rtr := mux.NewRouter()    rtr.HandleFunc("/setSession", handler1).Methods("GET")    rtr.HandleFunc("/getSession", handler2).Methods("GET")    http.Handle("/", rtr)    log.Println("Listening...")    http.ListenAndServe(":3000", http.DefaultServeMux)}func handler1(w http.ResponseWriter, r *http.Request) {    SetSessionValue(w, r, "key", "value")    w.Write([]byte("setSession"))}func handler2(w http.ResponseWriter, r *http.Request) {    w.Write([]byte("getSession"))    value := GetSessionValue(w, r, "key")    fmt.Println("value from session")    fmt.Println(value)}var authKey = []byte("secret") // Authorization Keyvar encKey = []byte("encKey") // Encryption Keyvar store = sessions.NewCookieStore(authKey, encKey)func initSession(r *http.Request) *sessions.Session {    store.Options = &sessions.Options{        MaxAge:   3600 * 1, // 1 hour        HttpOnly: true,    }    session, err := store.Get(r, "golang_cookie")    if err != nil {        panic(err)    }    return session}func SetSessionValue(w http.ResponseWriter, r *http.Request, key, value string) {    session := initSession(r)    session.Values[key] = value    fmt.Printf("set session with key %s and value %s\n", key, value)    session.Save(r, w)}func GetSessionValue(w http.ResponseWriter, r *http.Request, key string) string {    session := initSession(r)    valWithOutType := session.Values[key]    fmt.Printf("valWithOutType: %s\n", valWithOutType)    value, ok := valWithOutType.(string)    if !ok {        fmt.Println("cannot get session value by key: " + key)    }    return value}输出:myMac ~/forStack/session $ go run ./session.go2015/01/30 16:47:26 Listening...首先我打开 urlhttp://localhost:3000/setSession并获得输出:set session with key key and value value为什么valWithOutType是 nil,虽然我设置了 request /setSession?
查看完整描述

3 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

在您的initSession()功能中,您可以更改商店选项:


store.Options = &sessions.Options{

    MaxAge:   3600 * 1, // 1 hour

    HttpOnly: true,

}

该Options结构还包含一个重要的Path字段,cookie 将应用到该字段。如果你不设置它,它的默认值将是空字符串:""。这很可能会导致 cookie 不会与您的任何网址/路径匹配,因此您现有的会话将不会被找到。


添加一个路径以匹配您的所有网址,如下所示:


store.Options = &sessions.Options{

    Path:     "/",      // to match all requests

    MaxAge:   3600 * 1, // 1 hour

    HttpOnly: true,

}

此外,您不应该store.Options在每次调用中更改,initSession()因为您在每个传入请求中都调用了它。当你store像这样创建时,只需设置一次:


var store = sessions.NewCookieStore(authKey, encKey)


func init() {

    store.Options = &sessions.Options{

        Path:     "/",      // to match all requests

        MaxAge:   3600 * 1, // 1 hour

        HttpOnly: true,

    }

}


查看完整回答
反对 回复 2021-09-13
  • 3 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信