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

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, не забудьте поделиться с сообществом.