name: Модуль сессий

sort: 1

Введение в модуль сессий

Модуль сессий используется для хранения пользовательских данных между различными запросами. Поддерживается сохранение сессионого идентификатора в куки, таким образом если клиент не поддерживает куки, модуль не будет работать.

Вдохновлен database/sql, что значит: один интерфейс, множество реализаций. По умолчанию поддерживает 4 провайдера: memory, file, redis и mysql.

Установка сессионного модуля:

  1. go get github.com/astaxie/beego/session

Начальное использование:

Для начала, нужно импортировать пакет:

  1. import (
  2. "github.com/astaxie/beego/session"
  3. )

Затем инициализировать глобальную переменную в качестве менеджера сессий:

  1. var globalSessions *session.Manager

Затем инициализировать данные в вашей главной функции:

  1. func init() {
  2. globalSessions, _ = session.NewManager("memory", `{"cookieName":"gosessionid", "enableSetCookie,omitempty": true, "gclifetime":3600, "maxLifetime": 3600, "secure": false, "sessionIDHashFunc": "sha1", "sessionIDHashKey": "", "cookieLifeTime": 3600, "providerConfig": ""}`)
  3. go globalSessions.GC()
  4. }

Параметры NewManager:

  1. Имя провайдера: memory, file, mysql, redis
  2. JSON строка которая содержит конфигурационную информацию.
    1. cookieName: Имя куки которая хранит сессионный идентификтор у клиента
    2. enableSetCookie, omitempty: Включена ли SetCookie, omitempty
    3. gclifetime: Интервал GC (сборщика мусора).
    4. maxLifetime: Исчетение времени данных сохраненных на севрере
    5. secure: Включена ли https или нет. Настроить можно будет через cookie.Secure.
    6. sessionIDHashFunc: Функция генератор SessionID. По-умолчанию sha1.
    7. sessionIDHashKey: Хеш ключ.
    8. cookieLifeTime: Время истечение куки на клиенте. По-умолчанию 0, что значит что значит время жизни браузера.
    9. providerConfig: Провайдер специфичный конфиг. Смотрите ниже для большей информации.

Затем вы сможете использовать сессию в вашем коде:

  1. func login(w http.ResponseWriter, r *http.Request) {
  2. sess, _ := globalSessions.SessionStart(w, r)
  3. defer sess.SessionRelease(w)
  4. username := sess.Get("username")
  5. if r.Method == "GET" {
  6. t, _ := template.ParseFiles("login.gtpl")
  7. t.Execute(w, nil)
  8. } else {
  9. sess.Set("username", r.Form["username"])
  10. }
  11. }

Методы globalSessions:

  • SessionStart Вернуть объект сессии для текущего запроса.
  • SessionDestroy Уничтожить текущий сессионный объект.
  • SessionRegenerateId Сгенирировать новый sessionID.
  • GetActiveSession Получить активного юзера из сессии.
  • SetHashFunc Устаовить функцию генератор sessionID.
  • SetSecure Включить безопасную куку или нет.

Возвращенный объект сессии является интерфейсом. Методы этого интерфейса:

  • Set(key, value interface{}) error
  • Get(key interface{}) interface{}
  • Delete(key interface{}) error
  • SessionID() string
  • SessionRelease()
  • Flush() error

Конфигурация провайдера сессии

Мы уже видели конфигурацию memory провайдера. Ниже конфигурация других провайдеров:

  • mysql:

    Все переметры такие же как для memory кроме четвертого параметра, например:

    1. username:password@protocol(address)/dbname?param=value

    Подробности можете посмотреть по адресу go-sql-driver/mysql.

  • redis:

    Конфигурация соединения: address,pool,password

    1. 127.0.0.1:6379,100,astaxie
  • file:

    Путь для сохранения сессий. По умолчанию создает файлы на два уровня ниже. Например: если sessionID - xsnkjklkjjkh27hjh78908 файл будет сохранен так ./tmp/x/s/xsnkjklkjjkh27hjh78908

    1. ./tmp

Создание нового провайдера сессии

Иногда, нам нужно создать собственный провайдер сессии. Сессиойнный модуль использует интерфейс, таким образом вы можете реализовать этото интерфейс чтобы создать ваш собсвенный провайдер довольно просто.

  1. // SessionStore содержит все данные для одного сессиного процесса с уникальным id.
  2. type SessionStore interface {
  3. Set(key, value interface{}) error // Установить значение в сессию
  4. Get(key interface{}) interface{} // Получить значение из сессии
  5. Delete(key interface{}) error // Удалить значение из сессии
  6. SessionID() string // Получить текущий session ID
  7. SessionRelease(w http.ResponseWriter) // Освободить ресурсы & сохранить данные в провайдер & вернуть данные
  8. Flush() error // Удалить все данные
  9. }
  10. type Provider interface {
  11. SessionInit(maxlifetime int64, savePath string) error
  12. SessionRead(sid string) (SessionStore, error)
  13. SessionExist(sid string) bool
  14. SessionRegenerate(oldsid, sid string) (SessionStore, error)
  15. SessionDestroy(sid string) error
  16. SessionAll() int // Получить все активные сессии
  17. SessionGC()
  18. }

В конце, зарегистрируйте ваш провайдер:

  1. func init() {
  2. // own adapter is an instance of session.Provider
  3. session.Register("own", ownadapter)
  4. }