在Gorilla会话中使用自定义类型

时间:2014-07-18 22:04:50

标签: session go

我正在尝试在Golang中使用gorilla会话来存储会话数据。我发现我可以存储片段([]字符串),但我不能存储自定义结构片([] customtype)。我想知道是否有人有这个问题以及是否有任何修复。

我可以正常运行会话并获取其他不是自定义结构片段的变量。我甚至能够将正确的变量传递给session.Values [“variable”],但是当我执行session.Save(r,w)时,它似乎没有保存变量。

编辑:找到解决方案。一旦我完全理解,就会编辑。

3 个答案:

答案 0 :(得分:9)

解决了这个。

您需要注册gob类型,以便会话可以使用它。

例如:

import(
"encoding/gob"
"github.com/gorilla/sessions"
)

type Person struct {

FirstName    string
LastName     string
Email        string
Age            int
}

func main() {
   //now we can use it in the session
   gob.Register(Person{})
}

func createSession(w http.ResponseWriter, r *http.Request) {
   //create the session
   session, _ := store.Get(r, "Scholar0")

   //make the new struct
   x := Person{"Bob", "Smith", "Bob@Smith.com", 22}

   //add the value
   session.Values["User"] = x

   //save the session
   session.Save(r, w)
}

答案 1 :(得分:1)

未明确说明(但事后看来很有意义)的是,您必须已导出了字段(即type Person struct { Name ...type Person struct { name),否则序列化将不起作用gob无法访问这些字段。

答案 2 :(得分:-1)

我知道这已经得到了解答。但是,有关在会话中设置和检索对象的参考目的,请参阅下面的代码。

package main

import (
    "encoding/gob"
    "fmt"
    "net/http"
    "github.com/gorilla/securecookie"
    "github.com/gorilla/sessions"
)

var store = sessions.NewCookieStore(securecookie.GenerateRandomKey(32))

type Person struct {
    FirstName string
    LastName string
}

func createSession(w http.ResponseWriter, r *http.Request) {    
    gob.Register(Person{})

    session, _ := store.Get(r, "session-name")

    session.Values["person"] = Person{"Pogi", "Points"}
    session.Save(r, w)

    fmt.Println("Session initiated")
}

func getSession(w http.ResponseWriter, r *http.Request) {
    session, _ := store.Get(r, "session-name")
    fmt.Println(session.Values["person"])   
}

func main() {
    http.HandleFunc("/1", createSession)
    http.HandleFunc("/2", getSession)

    http.ListenAndServe(":8080", nil)
}

您可以通过以下方式访问:

http://localhost:8080/1 - >会话值设置
http://localhost:8080/2 - >会话值检索

希望这有帮助!