我正在尝试在Golang中使用gorilla会话来存储会话数据。我发现我可以存储片段([]字符串),但我不能存储自定义结构片([] customtype)。我想知道是否有人有这个问题以及是否有任何修复。
我可以正常运行会话并获取其他不是自定义结构片段的变量。我甚至能够将正确的变量传递给session.Values [“variable”],但是当我执行session.Save(r,w)时,它似乎没有保存变量。
编辑:找到解决方案。一旦我完全理解,就会编辑。答案 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 - >会话值检索
希望这有帮助!