Голанг Горилла/сессия

Я пытаюсь создать простое веб-приложение с логином пользователя.

Я нашел эту функцию в другом посте здесь.

func initSession(r *http.Request) *sessions.Session {
    session, _ := store.Get(r, "mBoxStore")
    if session.IsNew {
        session.Options.Domain = "localhost"
        session.Options.MaxAge = 10
        session.Options.HttpOnly = false
        session.Options.Secure = false
        log.Println("Create New Session (cookie)")
    } else {
        log.Println("Use Old Session (old cookie)")
    }
    return session
}

Срок действия файла cookie истекает после 10 seconds, но когда я перезагружаю страницу, например, после 1 Minute используется старый (истекший) файл cookie.

В моем браузере (Firefox) я вижу файл cookie с правильной датой истечения срока действия.

Я думаю, что он должен создать новый сеанс с новым файлом cookie или это неправильно?

какие-нибудь советы ?


person user3033143    schedule 16.02.2014    source источник
comment
Вам лучше установить параметры для каждого магазина при запуске приложения. Затем просто используйте session.Get в своих обработчиках (и проверьте наличие ошибок). Документы sessions хорошо освещают это: gorillatoolkit.org/pkg/sessions   -  person elithrar    schedule 17.02.2014
comment
Спасибо за Ваш ответ. Проблема не в коде... он работает для меня... я могу сохранять и читать данные из сеанса... Но он игнорирует дату истечения срока действия файла cookie. он всегда использует старый файл cookie.   -  person user3033143    schedule 17.02.2014


Ответы (1)


Причина, по которой вы видите Use Old Session (old cookie), заключается в том, что параметры сеанса устанавливаются только при первом создании файла cookie. Каждый раз, когда вы получаете доступ к файлу cookie до истечения срока его действия (isNew == false), Options не устанавливаются, а значения по умолчанию переопределяют те, которые вы установили при создании сеанса. По умолчанию MaxAge составляет 86400 * 30 (один месяц).

Вы можете убедиться в этом:

  1. Очистка всех файлов cookie для сайта (например, localhost)
  2. Вызов маршрута в браузере
  3. Проверка даты истечения срока действия только что созданного файла cookie - вы увидите, что сейчас + 10 секунд.
  4. Подождите эти 10 секунд.
  5. Обновите страницу — ваш журнал должен подтвердить, что это новый файл cookie.
  6. Теперь обновите страницу до истечения срока действия файла cookie (т.е. в течение 10 секунд).
  7. Вы увидите, что срок действия истекает сейчас + 1 месяц (по умолчанию).

Вот почему я предлагаю настроить параметры сеанса один раз при запуске приложения. Отклоняйтесь только в том случае, если вы устанавливаете более короткое время жизни файлов cookie в целях безопасности аутентификации, и в этих случаях используйте другое имя сеанса (например, _csrf_token со сроком действия 4 часа).

Фрагмент кода, который вы используете, также не идеален, поскольку он полностью игнорирует любые ошибки, возникающие при попытке получить сеанс. Вы можете столкнуться с ошибками, если базовое хранилище сеансов не работает и/или у пользователя отключены файлы cookie.

person elithrar    schedule 17.02.2014
comment
Спасибо за помощь :) Теперь я вижу проблему. я не видел месяц истечения срока действия в новом файле cookie, я смотрю только на время создания. - person user3033143; 17.02.2014
comment
На случай, если это неясно (мне это было непонятно сначала, когда в ответе говорилось: Я предлагаю установить параметры сеанса один раз при запуске приложения), в магазине есть .Options, как и session.Options . Следовательно: var sessionStore = sessions.NewCookieStore(...), а затем sessionStore.Options = &sessions.Options{ MaxAge: ... } и так далее. - person eduncan911; 16.07.2014
comment
Имейте в виду: NewCookieStore(...) вызывает sessionStore.MaxAge() со значением по умолчанию 86400 * 30 (1 месяц). Эта функция имеет цикл for, который устанавливает максимальный возраст всех базовых файлов cookie в хранилище с точки зрения сервера. Установка поля структуры .Options{MaxAge: ... }, как в приведенном выше комментарии, установит дату истечения срока действия будущих файлов cookie, отправляемых в браузер, но эта дата истечения срока действия не будет отражена в записи файлов cookie на сервере. Чтобы избежать несоответствия между датами истечения срока действия браузера/сервера, используйте вместо этого sessionStore.MaxAge() - person Dave Fort; 09.07.2020