Хранение постоянных данных сеанса в Rails без влияния на нормальное истечение срока сеанса - PullRequest
3 голосов
/ 14 февраля 2010

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

Я рассмотрел два подхода:

  1. Сохраните информацию в файле cookie сеанса. Проблема с этим подходом заключается в том, что мне нужно было бы установить время истечения срока действия cookie сеанса, что побочным эффектом приводит к тому, что сеанс входа пользователя в систему не истекает при закрытии браузера.
  2. Сохраните информацию в БД и сохраните ключ поиска в файле cookie на стороне клиента. Я обеспокоен проблемами с производительностью, поскольку это потребует дополнительных запросов и, возможно, некоторой десериализации для извлечения данных. Похоже, что Rails некоторое время назад переключил свое значение по умолчанию из ActiveRecordStore по причинам производительности: http://ryandaigle.com/articles/2007/2/21/what-s-new-in-edge-rails-cookie-based-sessions

Каков рекомендуемый способ достижения этого?

Ответы [ 2 ]

0 голосов
/ 05 августа 2012

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

Я считаю, что при использовании хранилища сеансов ActiveRecord скорость не является для меня фактором. В сеансе на основе файлов cookie вы обычно ограничиваете то, что храните в переменных сеанса, так что они, как правило, являются токенами, используемыми для поиска данных в базе данных. Если данные не нужно сохранять после сеанса, то целесообразно сохранить объект в сеансе, а не просто токен, потому что вы все равно попадете в базу данных для связанных записей. Если объект, который вы хотите извлечь, включает в себя дорогостоящую операцию извлечения, и вам она нужна в течение всего времени сеанса, возможно, имеет смысл сохранить этот объект в сеансе, а не просто в токене, и ударить по базе данных только один раз, когда сеанс впервые установлено.

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

@ joshsz хорошо подходит для использования несессионного cookie для сохранения данных вне сессии. Помните, что у сессии конечное время жизни.

0 голосов
/ 15 февраля 2010

Почему бы просто не использовать несессионный cookie?Вы можете указать, как долго он будет сохраняться на клиенте, и т. Д. См. http://api.rubyonrails.org/classes/ActionController/Cookies.html

Если вы беспокоитесь о том, что пользователь вмешивается в данные cookie, вы можете зашифровать данные cookie, используя такую ​​методику (взято из http://www.neeraj.name/blog/articles/834-how-cookie-stores-session-data-in-rails):

cookie_data = {:foo => "bar"}
digest = 'SHA1'
secret = 'my_encryption_secret'
data = ActiveSupport::Base64.encode64s(Marshal.dump(cookie_data))
digest_value = OpenSSL::HMAC.hexdigest(OpenSSL::Digest::Digest.new(digest), secret, data)
escaped_data_value = Rack::Utils.escape(data)
final_output = "#{escaped_data_value}--#{digest_value}"
cookies[:user_data] = final_output

и более поздних версий для чтения данных cookie:

Marshal.load(ActiveSupport::Base64.decode64(cookies[:user_data]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...