Почему Ruby on Rails создает новые Сессии при каждом ударе (иногда)? - PullRequest
5 голосов
/ 28 мая 2011

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

http://imageshack.us/f/191/screenshot20110527at832.png/ (Извините, но я не могу включить изображения сюда напрямую, так как я новый пользователь)

Веб-сайт включен в iframe на другом веб-сайте и имеет диспетчер, который отправляет (redirect_to) пользователя другому действию в том же контроллере на основе некоторых данных сеанса, т.е. для всех пользователей, один и тот же URL-адрес (mydomain). com / dispatcher) будет включен в iframe. Действие, сопоставленное с этим URL, затем решит, куда перенаправить пользователя на основе сеанса [: current_action].

На сайте почти нет трафика, поэтому нет никакого способа, которым на самом деле ок. 10 отдельных пользователей, которые обращаются к сайту каждую секунду. На самом деле, я вижу в файле production.log, что при перенаправлении пользователи имеют разные session_ids, например, при посещении диспетчера пользователь может иметь конкретный идентификатор сеанса, а при запросе фактического целевого действия (как следствие redirect_to в диспетчере) идентификатор сеанса будет изменен на что-то другое. Кроме того, большинство (> = 97,5% из более чем 16000 строк данных) строк данных сеанса имеют «время жизни», равное 0 секундам (т. Е. Созданный_кат равняется обновленному_ат).

У вас есть идеи, что может вызвать эту проблему?

Есть ли вероятность, что вызовы redirect_to испортят обработку сеанса RoR?

Большое спасибо заранее за ваши мысли!

Ответы [ 3 ]

2 голосов
/ 01 июня 2011

Оказалось, что было две проблемы:

  1. Сторонние файлы cookie в Internet Explorer: поскольку сайт был включен в iframe, все IE (IE6-IE9) будут блокировать файлы cookie, включая cookie сеанса. После этого пользователю будет предоставлен новый session_id при каждом перенаправлении.

  2. Кроме того, при переключении между хранилищами сеансов в Rails (например, между Cookie и хранилищем сеансов ActiveRecord) все существующие сеансы должны быть удалены / истекли. В противном случае RoR будет генерировать огромные идентификаторы сеанса, как в следующем выражении SQL:

    {: SQL => "INSERT INTO sessions (session_id data created_at updated_at) VALUES ( 'BAh7CUkiD3Nlc3Npb25faWQGOgZFRiIlZmRhMzRjMzdiOWU0YjhhMzIyNGU0Y2IwOWZiN2E4YTJJIgptdHVyawY7AEZ7CToSYXNzaWdubWVudF9pZEkiIEFTU0lHTk1FTlRfSURfTk9UX0FWQUlMQUJMRQY7AFQ6C2hpdF9pZEkiIzJRRzhUTktJTVpTTVU4U1ZSR0ZNNVBHVjRNTFlCRQY7AFQ6Dndvcmtlcl9pZEkiE0ExQzdBNFFYUE5DOTRDBjsAVDoPc3VibWl0X3VybEkiGmh0dHBzOi8vd3d3Lm10dXJrLmNvbQY7AFRJIhVza2lwcGVkX3Rhc2tfaWRzBjsARlsGaQBJIhBfY3NyZl90b2tlbgY7AEZJIjFvbHJiK2tSaDZ1dDhyZ011VmUyZnZrY01wWWFuQll6cVY1YWZ4M0c1QkhFPQY7AEY = - a4223802cfb90e6c75578cc1a27427cf96778598', 'BAh7B0kiCm10dXJrBjoGRUZ7AEkiEmlzX2Rpc3BhdGNoZWQGOwBGVA == \ п', ' 2011-05-28 05:47:19 ',' 2011-05-28 05:47:19 ')

В результате MySQL урезал session-id для соответствия 255 символам (спецификация столбца по умолчанию после переноса сеанса rails). Следовательно, по следующему запросу rails попытался восстановить сеанс, используя (очень длинный) session_id - конечно, безуспешно.

Я попытался исправить проблему IE, добавив следующий заголовок HTTP Response:

response.header["P3P"] = 'CP="CAO PSA CONi OTR OUR DEM ONL"'

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

1 голос
/ 28 мая 2011

Возможно, вашим посетителям выдаются новые значения session_id для каждого запроса из-за какой-либо ошибки конфигурации или проблемы с извлечением сеанса из базы данных.В сеансах на основе файлов cookie общая проблема заключается в том, что файл cookie назначается не тому домену, или у вас конфликт между именами хостов www.example.com и example.com при посещении версии www.

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

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

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

0 голосов
/ 30 марта 2012

Я использую https://github.com/grosser/ie_iframe_cookies, чтобы справиться с этим.Он заботится о том, что упомянул jhuebner в дополнение к обработке etags, как указано здесь http://robanderson123.wordpress.com/2011/02/25/p3p-header-hell/

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