2015-04-08 46 views
5

我已經導入的包作爲golang大猩猩/會話得到了零值,同時檢查會話

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

在我的方法,我創建並設置會議價值描述在大猩猩文檔

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

你檢查錯誤?看起來你在示例代碼中忽略了它們。如果我不得不猜測,我會說你在保存會話之前已經寫了'http.ResponseWriter'(發送頭文件)。 – seong

+0

是的,我已經檢查過它。在檢查GetSession()方法中的會話條件時沒有找到值 - >「找不到」。 –

+0

根據doc(大猩猩)保存任何會話,我們必須寫session.Save(r,w)..並且對於多個會話,他們提到sessions.Save(r,w)。 –

回答

1

我不知道你得到什麼值,但我想你想要一個字符串值。我寫了簡單的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) 
} 
2

你在你的getSession功能得到了一個錯誤。請更改session變量session1

另外要檢查是否會話值存在更好做這種方式:

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