2014-07-18 3 views
3

Я пытаюсь использовать сеансы горилл в Голанге для хранения данных сеанса. Я обнаружил, что могу хранить фрагменты строк ([]), но я не могу хранить фрагменты пользовательских структур ([] customtype). Мне было интересно, есть ли у кого-то эта проблема, и если есть какие-то проблемы.Использование пользовательских типов с сессиями Gorilla

Я могу нормально выполнять сеансы и получать другие переменные, которые не являются срезами пользовательских структур, которые я сохранил. Я даже могу передать правильные переменные в session.Values ​​["variable"], но когда я делаю session.Save (r, w), похоже, не сохраняет эту переменную.

EDIT: найдено решение. Будет редактировать, как только я получу полное понимание.

+0

отправьте ответ с кодом пожалуйста – OneOfOne

+0

Извините за задержку. Сообщение отправлено. – Ben

ответ

7

Решенный этот.

Вам необходимо зарегистрировать тип gob, чтобы сеансы могли его использовать.

Ex:

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", "[email protected]", 22} 

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

    //save the session 
    session.Save(r, w) 
} 
-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 - извлечения> значение сессии

Надеюсь, что это помогает!

Смежные вопросы