Сессия Scalatra без файлов cookie

Я использую среду Scalatra для создания веб-приложения. Приложение использует сеансы, но я не могу использовать сеансовые файлы cookie (потому что технически существует только один пользователь, который запускает несколько сеансов одновременно).

Каждый сеанс имеет уникальный сеансовый ключ, который я хочу использовать в качестве идентификатора. Я хочу, чтобы этот ключ был отправлен как параметр GET или POST вместо заголовка файла cookie.

Теперь у меня вопрос: Как я могу хранить информацию о сеансе (т. е. состояние) в сервлете Scalatra без файлов cookie, а только с параметром в качестве идентификатора?

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

(Безопасность не проблема)


person Waboodoo    schedule 19.04.2012    source источник


Ответы (2)


Я понял, как я могу это сделать.

В каждом сервлете Scalatra у меня есть доступ к глобальному servletContext, который реализует интерфейс javax.servlet.ServletContext. Я могу использовать два его метода setAttribute(x: String, y: Any) и getAttribute(x : String) для хранения информации о моих сеансах, где x — мой уникальный идентификатор, а y — информация о сеансе, закодированная как класс case Session.

Фактически у меня есть следующее:

def storeSession(key : String, session : Session) {
    servletContext.setAttribute(attributePrefix + key, session)
}

def loadSession(key : String) : Session = {
    val session = servletContext.getAttribute(attributePrefix + key)
    if (session != null) {
        session match {
            case s : Session => s
            case _ => null
        }
    } else {
        null
    }
}

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

Я предполагаю, что эту технику можно применить к любому сервлету на Java и Scala, который предоставляет экземпляр ServletContext, а не только Scalatra.

person Waboodoo    schedule 25.04.2012
comment
Это быстрое и простое решение по умолчанию для хранения данных сеанса при работе со средой сервлетов Java — именно то, что я искал. - person Chris W.; 20.06.2013
comment
Как вы получите ключ? Будет ли он генерироваться для каждого запроса? Как это определить сеанс? - person Rajeev; 24.12.2013
comment
В моем случае ключ генерируется для каждого нового сеанса (не для каждого запроса) с использованием генератора случайных чисел где-то еще в коде. Можно использовать любой уникальный идентификатор. - person Waboodoo; 24.12.2013
comment
Как насчет аннулирования сеанса в результате тайм-аута? Вы запускаете какую-то запланированную задачу, которая проверяет, какая сессия не использовалась в течение длительного времени? - person amorfis; 20.07.2015
comment
В моем случае у меня был отдельный поток, который периодически удалял старые сеансы (мои сеансовые ключи начинались с метки времени, чтобы я мог определить, сколько им лет), но может быть лучший способ сделать это. - person Waboodoo; 20.07.2015

Хороший вопрос.

Вместо сохранения состояния на диск и связанного с этим снижения производительности, как насчет хранения в памяти в духе Redis?

Существует реализация Scala от debasishg, крупного участника сообщества Scala, которая может отвечать всем требованиям.

На стороне забора без сохранения состояния, например, в Spray, мне предложили это как альтернативное средство для поддержания состояния на стороне сервера; то есть хранить идентификатор файла cookie клиента в кеше в памяти, а не полагаться на HttpSession

person virtualeyes    schedule 19.04.2012