2015-04-08 11 views
5

tôi đã nhập khẩu các gói nhưgolang khỉ đột/phiên có giá trị nil trong khi kiểm tra phiên

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

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

và xác định lưu trữ và phương pháp chính như sau

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

Trong phương pháp của tôi, tôi đã tạo và thiết lập phiên giá trị như mô tả trong gorilla 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) 
     }  
    } 
} 

Bây giờ nếu tôi muốn nhận giá trị phiên này theo phương pháp khác tôi nhận được nil mỗi lần. không biết điều gì sai trong mã của tôi.

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

Bạn có kiểm tra lỗi? Có vẻ như bạn đang bỏ qua chúng trong mã ví dụ của bạn. Nếu tôi phải đoán, tôi muốn nói rằng bạn đã viết thư cho 'http.ResponseWriter' trước khi lưu phiên (tiêu đề được gửi). – seong

+0

có, tôi đã kiểm tra. có giá trị nil -> "không tìm thấy " trong khi kiểm tra điều kiện cho phiên trong phương thức GetSession(). –

+0

theo doc (gorilla) để lưu bất kỳ phiên nào mà chúng ta đã viết session.Save (r, w) .. và cho nhiều phiên họ đã đề cập đến sessions.Save (r, w). –

Trả lời

1

Tôi không biết bạn có giá trị gì, nhưng tôi cho rằng bạn muốn có giá trị chuỗi. Tôi đã viết đơn giản func GetFoo() để nhận giá trị chuỗi từ session1.Values["foo"].

Full ví dụ dưới đây:

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

Bạn có một sai lầm ở chức năng GetSession của bạn. Vui lòng thay đổi session biến để session1

Ngoài ra để kiểm tra xem giá trị phiên hiện diện tốt hơn làm điều đó theo cách này:

session, err := store.Get(r, ssid) 
    if err == nil { 
     if value, ok := session.Values["foo"].(string); ok { 
      session_data = value 
     } 
    } 
Các vấn đề liên quan