Сессия Мартини не перемещается между запросами
Я пишу веб-приложение, используя библиотеку сессий martini-contrib. Я, кажется, столкнулся с проблемой, хотя. Моя сессия, кажется, не перемещается между запросами в браузере.
Я следовал точным рекомендациям, которые были изложены в примере кода, но мой код не работает. Ниже приведены соответствующие части:
Страница авторизации:
m.Get("/login", binding.Bind(LoginForm{}), func(r render.Render, session sessions.Session, form LoginForm) string {
// Get info from the database.
conn, err := sql.Open("sqlite3", "ocdns.db")
defer conn.Close()
// Prepare the statement.
stmt, err := conn.Prepare(`
SELECT user_id, username, name_first, name_last, role, team_id
FROM User
WHERE username = ? AND password = ?
LIMIT 1;
`)
if err != nil {
log.Fatal(err)
}
defer stmt.Close()
// Query the database and set appropriate items if a row was actually returned.
var id string
var username string
var name_first string
var name_last string
var role string
var team_id string
err = stmt.QueryRow(form.Username, form.Password).Scan(&id, &username, &name_first, &name_last, &role, &team_id)
if err != nil {
log.Print("!! Bad login from " + form.Username + " with " + form.Password)
log.Fatal(err)
} else {
log.Print(">" + id + "<")
log.Print(">" + username + "<")
log.Print(">" + name_first + "<")
log.Print(">" + name_last + "<")
log.Print(">" + role + "<")
log.Print(">" + team_id + "<")
session.Set("id", id)
session.Set("username", username)
session.Set("name_first", name_first)
session.Set("name_last", name_last)
session.Set("role", role)
session.Set("team_id", team_id)
v := session.Get("name_first")
if v == nil {
log.Print("!! Uh oh.")
}
log.Print(v.(string))
return "OK"
}
return "Bad"
})
Страница проверки сеанса:
m.Get("/session", func(session sessions.Session) string {
var c Context
i := session.Get("id")
if i == nil {
c.Id = -1
}
c.Id, _ = strconv.Atoi(i.(string))
i = session.Get("username")
if i == nil {
log.Print("!! username")
}
if vs, ok := i.(string); ok {
c.Username = vs
} else {
log.Print(vs)
}
log.Print(c)
j, _ := json.Marshal(c)
return string(j)
})
Структура контекста:
type Context struct {
Id int `json:"id"`
Username string `json:"username"`
NameFirst string `json:"name_first"`
NameLast string `json:"name_last"`
Role string `json:"role"`
TeamId int `json:"team_id"`
}
Наконец, мое сессионное объявление:
// Create session store.
store := sessions.NewCookieStore([]byte("secret123"))
m.Use(sessions.Sessions("my_session", store))
Я пытался очистить кэш, чтобы он заработал, но это не так. Я заглянул в инструменты разработчика Chrome, чтобы узнать, используется ли хранилище, и обнаружил, что сеанс перемещался между двумя страницами, но вывод session
запрос был пустым Context
JSON СТРУКТУРА.
Мне нужно выяснить, почему мои данные сеанса теряются между запросами и что я могу сделать, чтобы это исправить. Я посмотрел здесь, и, хотя ничто не соответствует моей точной проблеме, я обнаружил, что были те, которые имели проблемы с их конфигурацией веб-сервера.
Заранее спасибо!
1 ответ
Вы должны изменить свой первый вызов функции следующим образом, чтобы убедиться, что он должен перейти в сессию перед входом в систему.
m.Get("/login", SOME_FUNC_TO_SEESION, func(r render.Render, session sessions.Session, form LoginForm) string {
Вот пример видео, надеюсь, оно вам поможет. Ваш код должен хорошо работать. https://gophercasts.io/lessons/8-auth-part-2