猿问

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

我无法通过这种方式从会话中获得价值,它是nil:


session := initSession(r)

valWithOutType := session.Values[key]

完整代码:


package main


import (

    "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 Key


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


var 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.go

2015/01/30 16:47:26 Listening...

首先我打开 urlhttp://localhost:3000/setSession并获得输出:


set session with key key and value value

为什么valWithOutType是 nil,虽然我设置了 request /setSession?


qq_遁去的一_1
浏览 157回答 3
3回答

慕的地8271018

在您的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,    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答