Мой сеанс Rails сбрасывается при наличии одновременных запросов - PullRequest
4 голосов
/ 08 июня 2010

Я думаю, что я что-то неправильно понимаю в сеансах Rails, поэтому, пожалуйста, потерпите меня, возможно, я не буду формулировать мой вопрос лучшим образом.

Я работаю над приложением для iPhone с бэкэндом Ruby on Rails. У меня есть веб-представление, которое по умолчанию переходит к действию index одного контроллера (и использует сеансы), а в фоновом режиме связка вызовов API направляется на другой контроллер (и которым не нужно использовать сеансы).

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

Request A (first controller) starts.  Session is empty.
Request B (second controller) starts.  Session is empty.
Request A finishes.  Request A has done authentication, and stored the user ID in the session. Session contains user ID.
Request B finishes.  Session is empty.
Request C starts.  Session is empty - not what I want.

Теперь странно то, что запрос B НЕ должен ничего записывать в сеанс.

У меня есть фильтры до и после, которые ЧИТАЮТ с сессии - такие вещи, как:

user = User.find_by_id(session[:id])

или

logger.debug session.inspect

и если я удаляю все из них, то все работает как положено - содержимое сеанса устанавливается по запросу A, и они все еще там, когда начинается запрос C.

Итак. Я думаю, что мне чего-то не хватает в работе сессий. Почему чтение с сессии перезаписывает это? Должен ли я получить к нему доступ другим способом? Я совершенно не на том пути, и проблема в другом месте?

Спасибо за любые идеи!

Ответы [ 3 ]

4 голосов
/ 29 сентября 2012

Это результат состояния гонки, вызванного тем, как рельсы обрабатывают сессию. Смотри http://www.paulbutcher.com/2007/05/race-conditions-in-rails-sessions-and-how-to-fix-them/

Похоже, что у вас не может быть одновременных запросов на изменение сеанса, надежных. Решение состоит в том, чтобы использовать другой метод хранения сеанса (например, active_record или redis), или вы можете исключить одновременные запросы.

1 голос
/ 01 апреля 2011

Возможно, ваши сеансы основаны на файлах cookie. Если это так, то каждый запрос начинается с одного и того же cookie (сеанса). Файл cookie содержит содержимое сеанса. Попробуйте переключить хранилище на сервер. Но я в вашем случае с аутентификацией думаю, что было бы намного лучше не делать эту асинхронность.

Request A (first controller) starts.  Session is empty.
Request B (second controller) starts.  Session is empty.
Request A finishes.  Request A has done authentication, and stored the user ID in the session. Session contains user ID
   .....AND returning the session content in a cookie.
Request B finishes.  Session is empty. 
   THIS one is setting blank session.
Request C starts.  Session is empty - not what I want. 
   Thats because B has set reset the session
0 голосов
/ 08 июня 2010

Возможно, это потому, что вы сохраняете идентификатор пользователя как ": id" в объекте сеанса. : id может быть зарезервированным ключом в объекте. Попробуйте использовать другое имя, например, session [: user_id].

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...