Книга: Программирование на языке Ruby

19.1.4. Сеансы пользователей

19.1.4. Сеансы пользователей

Куки — это хорошо, если вам нужно сохранить простые данные и вы не прочь возложить на браузер заботу об их хранении. Но часто предъявляются более жесткие требования. Что если нужно сохранить много данных и вы не хотите гонять их «взад-вперед» при каждом запросе? К тому же данные могут быть секретными, так что доверять их хранение браузеру нежелательно.

В таких случаях можно воспользоваться классом CGI::Session. Он аналогичен классу CGI::Cookie в том смысле, что значения хранятся в структуре, напоминающей хэш.

require "cgi"
require "cgi/session"
cgi = CGI.new("html4")
sess = CGI::Session.new(cgi, "session_key" => "a_test",
 "prefix" => "rubysess.")
lastaccess = sess["lastaccess"].to_s
sess["lastaccess"] = Time.now
if cgi['bgcolor'][0] =~ /[a-z]/
 sess["bgcolor"] = cgi['bgcolor']
end
cgi.out do
 cgi.html do
  cgi.body ("bgcolor" => sess["bgcolor"]) do
   "Фон этой страницы" +
   "изменяется в зависимости от значения 'bgcolor'," +
   "хранящегося в сеансе каждого пользователя." +
   "Время последнего доступа: #{lastaccess}"
  end
 end
end

Если обратиться к URL /thatscript.cgi?bgcolor=red, то фоновый цвет страницы у данного пользователя станет красным и останется таким до тех пор, пока он не обратится к такому же URL, но с другим значением параметра "bgcolor". При создании объекта CGI::Session указываются объект CGI и набор параметров в хэше. Необязательный параметр session_key определяет ключ, с помощью которого браузер будет идентифицировать себя при каждом запросе. Сеансовые данные хранятся во временном файле, своем для каждого сеанса, а параметр prefix задает строку, с которой должно начинаться имя файла, чтобы проще было опознать все такие файлы в файловой системе сервера.

Классу CGI::Session пока недостает многих возможностей, в частности умения хранить объекты, отличные от String, организации общего хранилища сеансовых данных для нескольких серверов и пр. К счастью, уже готов подключаемый механизм database_manager, так что некоторые из этих функций нетрудно добавить. Если вы придумаете что-нибудь интересное в отношении класса CGI::Session, не забудьте поделиться с сообществом.

Оглавление книги


Генерация: 1.924. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз