2015-04-08 7 views
5

mam importowane pakiety jakogolang goryl/sesja dostał wartość zerową podczas sprawdzania sesji

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

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

i zdefiniowane sklep i sposób główny jak postępować

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) 
} 

W moim sposobem stworzyłem i ustawić sesji wartość opisana w gorylku doc ​​

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) 
     }  
    } 
} 

Teraz, jeśli chcę uzyskać tę wartość sesji w innej metodzie mam zero za każdym razem. nie wiem, co się dzieje w moim kodzie.

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"]) 
    } 
} 
+1

Czy sprawdzić błędy? Wygląda na to, że ignorujesz je w przykładowym kodzie. Gdybym miał zgadywać, powiedziałbym, że napisałeś już do 'http.ResponseWriter' przed zapisaniem sesji (nagłówki wysłane). – seong

+0

Tak, sprawdziłem to. ma zerową wartość -> "nie znaleziono " podczas sprawdzania warunku sesji w metodzie GetSession(). –

+0

zgodnie z doc (gorylem) do zapisania każdej sesji musimy napisać session.Save (r, w) .. i dla wielu sesji wspomina sesje.Save (r, w). –

Odpowiedz

1

nie wiem jakie wartości Ci, co dostajesz, ale zakładam, że chcesz mieć wartość ciągu. Napisałem prosty func GetFoo(), aby uzyskać wartość ciągu od session1.Values["foo"].

Pełny przykład poniżej:

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) 
} 
2

Masz błąd w swojej funkcji getSession. Proszę zmienić session zmienną session1

także sprawdzić, czy wartość jest obecna sesja lepiej zrobić to w ten sposób:

session, err := store.Get(r, ssid) 
    if err == nil { 
     if value, ok := session.Values["foo"].(string); ok { 
      session_data = value 
     } 
    } 
Powiązane problemy