golang gorilla/session получил нулевое значение при проверке сеанса

Я импортировал пакеты как

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

    //CORS
    "github.com/rs/cors"
    "github.com/justinas/alice"  
)

и определил магазин и основной метод следующим образом

var store = sessions.NewCookieStore([]byte("something-very-secret")) 

const My_UI="http://localhost:3000"

func init() {
    store.Options = &sessions.Options{
        Path:     "/",
        MaxAge:   3600 * 1, // 1 hour
        HttpOnly: true,
    }
}

var router = mux.NewRouter() //MUX Handeler

//MAIN Function

func main() {
    c := cors.New(cors.Options{
        AllowedOrigins: []string{My_UI},
    })

    router.HandleFunc("/submitted",Login)
    router.HandleFunc("/check",GetSession)
    http.Handle("/", router)

    chain := alice.New(c.Handler).Then(router) //CORS enable

    fmt.Println("server started at port 8080")
    http.ListenAndServe(":8080", chain)
}

В моем методе я создал и установил значение сеанса, как описано в документе gorilla.

func Login(w http.ResponseWriter, r *http.Request) {         
    fmt.Println("In login----------->")
    sess := GetCon()                              //get connection session
    defer sess.Close()                           //close session    
    c := sess.DB("mydb").C("users")      //collection-> select db table

    session1, _ := store.Get(r, "loginSession")  //login session

    //parse json data  
    form := LoginUser{}
    err := json.NewDecoder(r.Body).Decode(&form)
    if err !=nil {
        fmt.Println(err)
    }

    //get query data
    var result []Person

    errc1 := c.Find(bson.M{"email":form.Email,"password":form.Password}).All(&result)

    if errc1 != nil {
        js, err2 := json.Marshal("false")
        if err2 != nil{return}
        w.Header().Set("Content-Type", "application/json")
        w.Write(js)     
    } else {
        if len(result)==0 {
            if err2 != nil {
                return
            }
            w.Header().Set("Content-Type", "application/json")
            w.Write(js) 
        } else {
            fmt.Println("Success")  
            session1.Values["foo"] = "bar"  
            session1.Save(r, w) 
            fmt.Println("saved",session1)
            js, err2 := json.Marshal(&result[0].Id)
            if err2 != nil {return}
            w.Header().Set("Content-Type", "application/json")
            w.Write(js) 
        }       
    }   
}

Теперь, если я хочу получить это значение сеанса другим методом, я каждый раз получаю ноль. не знаю, что не так в моем коде.

func GetSession(w http.ResponseWriter, r *http.Request) {
    session1, _ := store.Get(r, "loginSession")
    fmt.Println("Session in SessionHandler",session1)

    if session.Values["foo"] == nil {
        fmt.Println("not found",session.Values["foo"]))
    } else {
        fmt.Println("value",session.Values["foo"])
    }
}

person Mrugank Dhimmar    schedule 08.04.2015    source источник
comment
Вы на ошибки проверяли? Похоже, вы игнорируете их в своем примере кода. Если бы мне пришлось угадывать, я бы сказал, что вы уже написали http.ResponseWriter перед сохранением сеанса (заголовки отправлены).   -  person seong    schedule 08.04.2015
comment
да, я проверил это. получено нулевое значение -> не найдено ‹nil› при проверке условия сеанса в методе GetSession().   -  person Mrugank Dhimmar    schedule 08.04.2015
comment
в соответствии с документом (горилла) для сохранения любого сеанса мы должны написать session.Save(r, w).. и для нескольких сеансов у них есть упоминание session.Save(r,w).   -  person Mrugank Dhimmar    schedule 08.04.2015
comment
Правильно, но вам нужно сделать это ДО того, как вы отобразите шаблон или напишите какой-либо ответ. Можете ли вы опубликовать полную функцию Login в своем коде?   -  person elithrar    schedule 08.04.2015
comment
Я не отображаю никаких шаблонов из golang. Я использовал angularJS для этого. golang обрабатывает только json-запрос от angular, обрабатывает этот запрос и возвращает ответ angular.   -  person Mrugank Dhimmar    schedule 09.04.2015
comment
Рендеринг тут ни при чем. Если вы выполняете вывод в своем теле HTTP до того, как установите заголовки (где будет установлен файл cookie), это не сработает.   -  person seong    schedule 09.04.2015
comment
Ничего против alice и rs/cors. Но промежуточное программное обеспечение не так сложно, как cors.   -  person CESCO    schedule 08.09.2016
comment
Использует ли ваше имя файла cookie сеанса пробелы? Если это так, удалите все пробелы и повторите попытку. (См. github.com/golang/go/issues/9758 ).   -  person carbocation    schedule 11.10.2016


Ответы (2)


У вас ошибка в функции GetSession. Измените переменную session на session1

Также, чтобы проверить, присутствует ли значение сеанса, лучше сделать это следующим образом:

session, err := store.Get(r, ssid)
    if err == nil {
        if value, ok := session.Values["foo"].(string); ok {
            session_data = value
        }
    }
person Marcel Novy    schedule 24.10.2016

Я не знаю, какое значение вам нужно получить, но я предполагаю, что вам нужно строковое значение. Я написал простой func GetFoo(), чтобы получить строковое значение из session1.Values["foo"].

Полный пример ниже:

package main

import (
    "fmt"
    "net/http"

    "github.com/gorilla/mux"
    "github.com/gorilla/sessions"
    "github.com/justinas/alice"
    "github.com/rs/cors"
)

var store = sessions.NewCookieStore([]byte("something-very-secret"))

const My_UI = "http://localhost:3000"

var router = mux.NewRouter() //MUX Handeler

//MAIN Function
func init() {
    store.Options = &sessions.Options{
        Path:     "/",
        MaxAge:   3600 * 1, // 1 hour
        HttpOnly: true,
    }
}

func main() {
    c := cors.New(cors.Options{
        AllowedOrigins: []string{My_UI},
    })
    router.HandleFunc("/login", Login)
    router.HandleFunc("/check", GetSession)
    http.Handle("/", router)
    chain := alice.New(c.Handler).Then(router) //CORS enable
    fmt.Println("server started at port 8080")
    http.ListenAndServe(":8080", chain)
}

func GetFoo(f interface{}) string {
    if f != nil {
        if foo, ok := f.(string); ok {
            return foo
        }
    }
    return ""
}

func GetSession(w http.ResponseWriter, r *http.Request) {
    session1, _ := store.Get(r, "loginSession")
    foo := GetFoo(session1.Values["foo"])
    if foo == "" {
        fmt.Println("Foo is not set! Login to set value.")
    } else {
        fmt.Println("Foo Value:", foo, ".")
    }
}

func Login(w http.ResponseWriter, r *http.Request) {
    // Save Foo
    session1, _ := store.Get(r, "loginSession")
    session1.Values["foo"] = "bar"
    session1.Save(r, w)
}
person Kroksys    schedule 24.10.2016