Подтвердить что ты не робот

Переключить переменные сеанса?

Я новичок в языке Go (Golang), и я пишу веб-приложение. Я хотел бы использовать переменные сеанса, такие как вид в PHP (переменные, доступные с одной страницы на другую и уникальные для пользовательского сеанса). Есть что-то подобное в Go? Если нет, как бы я сам их реализовал? Или какие существуют альтернативные методы?

4b9b3361

Ответ 1

Вероятно, вы хотите взглянуть на gorilla. Он поддерживает сеанс, как описано здесь.

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

Возможные решения:

  • goroutine на сеанс пользователя для хранения переменных сеанса в памяти.
  • сохраните переменные в файле cookie сеанса.
  • используйте базу данных для хранения данных сеанса пользователя.

Я оставлю детали реализации каждого из них читателю.

Ответ 2

Здесь альтернатива в случае, если вам просто нужна поддержка сеанса без полного веб-инструментария.

https://github.com/bpowers/seshcookie

Ответ 3

Здесь другая альтернатива (раскрытие: я автор):

https://github.com/icza/session

Цитата из документа:


Этот пакет обеспечивает простую в использовании, расширяемую и безопасную реализацию и управление сеансом. Документацию пакета можно найти и godoc.org:

https://godoc.org/github.com/icza/session

Это "просто" реализация и управление сеансом HTTP, вы можете использовать его как есть или с любыми существующими инструментами Go и инструментами Go.

Обзор

В пакете есть 3 ключевых игрока:

  • Session - это интерфейс сеанса (HTTP). Мы можем использовать его для хранения и извлечения из него постоянных и переменных атрибутов.
  • Store - это интерфейс хранилища сеансов, который отвечает за хранение сеансов и делает их доступными по их идентификаторам на стороне сервера.
  • Manager - это интерфейс диспетчера сеансов, который отвечает за получение Session от (входящего) HTTP-запроса и добавляет Session к HTTP-ответу, чтобы клиент узнайте о сеансе. A Manager имеет поддержку Store, которая отвечает за управление значениями Session на стороне сервера.

Игроки этого пакета представлены интерфейсами, и для всех этих игроков предусмотрены различные реализации. Вы не связаны предоставленными реализациями, не стесняйтесь предоставлять свои собственные реализации для любого из игроков.

Использование

Использование не может быть проще. Чтобы получить текущий сеанс, связанный с http.Request:

sess := session.Get(r)
if sess == nil {
    // No session (yet)
} else {
    // We have a session, use it
}

Чтобы создать новый сеанс (например, при успешном входе в систему) и добавить его в http.ResponseWriter (чтобы клиент знал о сессия):

sess := session.NewSession()
session.Add(sess, w)

Давайте рассмотрим более сложное создание сеанса: пусть предоставит постоянный атрибут (для времени жизни сеанса) и начальный, переменный атрибут:

sess := session.NewSessionOptions(&session.SessOptions{
    CAttrs: map[string]interface{}{"UserName": userName},
    Attrs:  map[string]interface{}{"Count": 1},
})

И чтобы получить доступ к этим атрибутам и изменить значение "Count":

userName := sess.CAttr("UserName")
count := sess.Attr("Count").(int) // Type assertion, you might wanna check if it succeeds
sess.SetAttr("Count", count+1)    // Increment count

(Конечно, переменные атрибуты могут быть добавлены позже также с Session.SetAttr(), а не только при создании сеанса.)

Чтобы удалить сеанс (например, при выходе из системы):

session.Remove(sess, w)

Просмотрите демонстрационное приложение сеанса которое показывает все это в действии.

Поддержка Google App Engine

Пакет обеспечивает поддержку платформы Google App Engine (GAE).

Документация не включает его (из-за ограничения сборки +build appengine), но вот оно: gae_memcache_store.go

Реализация хранит сеансы в Memcache, а также сохраняет сеансы в хранилище данных в качестве резервной копии, если данные будут удалены из Memcache. Это поведение необязательно, Datastore можно полностью отключить. Вы также можете выбрать, будет ли сохранение в хранилище данных синхронно (в том же goroutine) или асинхронно (в другом goroutine), что приведет к более быстрому времени отклика.

Мы можем использовать функции NewMemcacheStore() и NewMemcacheStoreOptions() для создания сеанса Store, который хранит сеансы в MemCache GAE. Важно отметить, что, поскольку доступ к Memcache зависит от контекста Appengine, связанного с http.Request, возвращаемое хранилище может использоваться только для срока службы запроса! Обратите внимание, что Store будет автоматически "очищать" сеансы от доступа, когда магазин закрыт, поэтому очень важно закрыть хранилище в конце вашего запроса; это обычно делается путем закрытия диспетчера сеансов, которому вы передали хранилище (желательно с инструкцией defer).

Поэтому в каждой обработке запроса мы должны создать новый диспетчер сеансов, используя новый Store, и мы можем использовать диспетчер сеансов для выполнения связанных с сеансом задач, примерно так:

ctx := appengine.NewContext(r)
sessmgr := session.NewCookieManager(session.NewMemcacheStore(ctx))
defer sessmgr.Close() // This will ensure changes made to the session are auto-saved
                      // in Memcache (and optionally in the Datastore).

sess := sessmgr.Get(r) // Get current session
if sess != nil {
    // Session exists, do something with it.
    ctx.Infof("Count: %v", sess.Attr("Count"))
} else {
    // No session yet, let create one and add it:
    sess = session.NewSession()
    sess.SetAttr("Count", 1)
    sessmgr.Add(sess, w)
}

Истекшие сеансы автоматически не удаляются из хранилища данных. Чтобы удалить истекшие сеансы, пакет предоставляет функцию PurgeExpiredSessFromDSFunc(), которая возвращает http.HandlerFunc. Рекомендуется зарегистрировать возвращаемую функцию обработчика на путь, который затем может быть определен как задание cron, которое должно вызываться периодически, например. через каждые 30 минут (по вашему выбору). Поскольку обработчики cron могут работать до 10 минут, возвращаемый обработчик остановится через 8 минут для полной безопасности, даже если есть истекшие, завершенные сеансы с истекшим сроком действия. Его можно зарегистрировать следующим образом:

http.HandleFunc("/demo/purge", session.PurgeExpiredSessFromDSFunc(""))

Проверьте демонстрационное приложение сеанса GAE, которое показывает, как его можно использовать. cron.yamlфайл демонстрации показывает, как задание cron можно определить для очистки истекших сеансов.

Ознакомьтесь с демо-приложение сеанса GAE, в котором показано, как использовать это в действии.