name: Модуль сессий
sort: 1
Введение в модуль сессий
Модуль сессий используется для хранения пользовательских данных между различными запросами. Поддерживается сохранение сессионого идентификатора в куки, таким образом если клиент не поддерживает куки, модуль не будет работать.
Вдохновлен database/sql, что значит: один интерфейс, множество реализаций. По умолчанию поддерживает 4 провайдера: memory, file, redis и mysql.
Установка сессионного модуля:
go get github.com/astaxie/beego/session
Начальное использование:
Для начала, нужно импортировать пакет:
import ("github.com/astaxie/beego/session")
Затем инициализировать глобальную переменную в качестве менеджера сессий:
var globalSessions *session.Manager
Затем инициализировать данные в вашей главной функции:
func init() {globalSessions, _ = session.NewManager("memory", `{"cookieName":"gosessionid", "enableSetCookie,omitempty": true, "gclifetime":3600, "maxLifetime": 3600, "secure": false, "sessionIDHashFunc": "sha1", "sessionIDHashKey": "", "cookieLifeTime": 3600, "providerConfig": ""}`)go globalSessions.GC()}
Параметры NewManager:
- Имя провайдера: memory, file, mysql, redis
- JSON строка которая содержит конфигурационную информацию.
- cookieName: Имя куки которая хранит сессионный идентификтор у клиента
- enableSetCookie, omitempty: Включена ли SetCookie, omitempty
- gclifetime: Интервал GC (сборщика мусора).
- maxLifetime: Исчетение времени данных сохраненных на севрере
- secure: Включена ли https или нет. Настроить можно будет через
cookie.Secure. - sessionIDHashFunc: Функция генератор SessionID. По-умолчанию
sha1. - sessionIDHashKey: Хеш ключ.
- cookieLifeTime: Время истечение куки на клиенте. По-умолчанию 0, что значит что значит время жизни браузера.
- providerConfig: Провайдер специфичный конфиг. Смотрите ниже для большей информации.
Затем вы сможете использовать сессию в вашем коде:
func login(w http.ResponseWriter, r *http.Request) {sess, _ := globalSessions.SessionStart(w, r)defer sess.SessionRelease(w)username := sess.Get("username")if r.Method == "GET" {t, _ := template.ParseFiles("login.gtpl")t.Execute(w, nil)} else {sess.Set("username", r.Form["username"])}}
Методы globalSessions:
SessionStartВернуть объект сессии для текущего запроса.SessionDestroyУничтожить текущий сессионный объект.SessionRegenerateIdСгенирировать новый sessionID.GetActiveSessionПолучить активного юзера из сессии.SetHashFuncУстаовить функцию генератор sessionID.SetSecureВключить безопасную куку или нет.
Возвращенный объект сессии является интерфейсом. Методы этого интерфейса:
Set(key, value interface{}) errorGet(key interface{}) interface{}Delete(key interface{}) errorSessionID() stringSessionRelease()Flush() error
Конфигурация провайдера сессии
Мы уже видели конфигурацию memory провайдера. Ниже конфигурация других провайдеров:
mysql:Все переметры такие же как для
memoryкроме четвертого параметра, например:username:password@protocol(address)/dbname?param=value
Подробности можете посмотреть по адресу go-sql-driver/mysql.
redis:Конфигурация соединения: address,pool,password
127.0.0.1:6379,100,astaxie
file:Путь для сохранения сессий. По умолчанию создает файлы на два уровня ниже. Например: если sessionID -
xsnkjklkjjkh27hjh78908файл будет сохранен так./tmp/x/s/xsnkjklkjjkh27hjh78908./tmp
Создание нового провайдера сессии
Иногда, нам нужно создать собственный провайдер сессии. Сессиойнный модуль использует интерфейс, таким образом вы можете реализовать этото интерфейс чтобы создать ваш собсвенный провайдер довольно просто.
// SessionStore содержит все данные для одного сессиного процесса с уникальным id.type SessionStore interface {Set(key, value interface{}) error // Установить значение в сессиюGet(key interface{}) interface{} // Получить значение из сессииDelete(key interface{}) error // Удалить значение из сессииSessionID() string // Получить текущий session IDSessionRelease(w http.ResponseWriter) // Освободить ресурсы & сохранить данные в провайдер & вернуть данныеFlush() error // Удалить все данные}type Provider interface {SessionInit(maxlifetime int64, savePath string) errorSessionRead(sid string) (SessionStore, error)SessionExist(sid string) boolSessionRegenerate(oldsid, sid string) (SessionStore, error)SessionDestroy(sid string) errorSessionAll() int // Получить все активные сессииSessionGC()}
В конце, зарегистрируйте ваш провайдер:
func init() {// own adapter is an instance of session.Providersession.Register("own", ownadapter)}
