Использование сеанса при отправке набора AJAX-запросов

#ruby-on-rails #ajax #session #ruby-on-rails-4

#ruby-on-rails #ajax #сеанс #ruby-on-rails-4

Вопрос:

В моем приложении Rails я одновременно выполняю набор вызовов AJAX, что приводит к отправке одного и того же файла cookie сеанса для каждого запроса. Проблема в том, что rails устанавливает новый файл cookie сеанса в каждом ответе и, следовательно, ожидает, что значение cookie в запросе после.

Я ищу решение на стороне сервера, потому что я не хочу связывать эти запросы (они отнимают много времени).

Возможно ли изменить это поведение? И какие риски для безопасности будут связаны с этим?

(Я использую Rails 4.1.0)

Большое спасибо

Ответ №1:

Если у пользователя еще нет файла cookie сеанса, вы ничего не можете сделать.

Если вы можете гарантировать, что у пользователя уже есть сеанс (например, если вы требуете, чтобы пользователи вошли в систему), вы можете сделать это с помощью хранилища сеансов на стороне сервера.

В хранилище сеансов на стороне сервера файл cookie сеанса содержит только идентификатор — даже если ваши перекрывающиеся ajax-запросы изменяют значения в сеансе, они не изменят файл cookie сеанса. В целом это лучше с точки зрения безопасности: например, старые сеансы не могут быть воспроизведены после выхода пользователя из системы. Rails по умолчанию переключился на хранилище файлов cookie по соображениям производительности: доступ к внешнему хранилищу данных не требуется (однако это немного увеличивает объем данных, отправляемых по каждому запросу)

Однако переключения на серверное хранилище сеансов недостаточно, и оно по-прежнему оставляет вас открытыми для условий гонки. Очень легко получить последовательность в соответствии с

  • Запрос сеанса загрузки
  • Запрос B загружает сеанс
  • Запрос B завершается, сеанс сохраняется
  • Запрос A сохраняет сеанс и перезаписывает изменения сеанса, внесенные B

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

Некоторое время назад я написал такое хранилище сеансов. Я не обновлял его для rails 4, поскольку это больше не то, что мне нужно, но вы можете (или, по крайней мере, найти в нем вдохновение)

Комментарии:

1. Хороший ответ, спасибо! Я изучил это и нашел подходящий камень для этого. github.com/rails/activerecord-session_store … Я думаю, что нет причин беспокоиться о состоянии, о котором вы упомянули в самом начале, потому что сеанс устанавливается после первого запроса, и после этого приходят эти вызовы AJAX (с уже определенным session_id).

2. Хранилище сеансов, на которое я ссылался, было написано потому, что active record store (который раньше был частью rails) отображал условия гонки так, как мы его использовали. Возможно, это изменилось, но проверьте

3. К счастью, мне не нужно беспокоиться об этом в моем проекте, потому что только один из этих запросов записывается в сеанс. Таким образом, проблема была действительно только в последовательности вызовов. Но вы правы, другие читатели должны учитывать это.