|
||||||||
|
Поддержка информации о пользователях с помощью Cookies.
Несмотря на то что протокол HTTP ? весьма мощный инструмент, одной из его слабых сторон является то, что он не фиксирует своего состояния. Это значит, что после завершения НТТР-переговоров ни клиент, ни сервер совершенно не помнят даже о самом факте переговоров, не говоря уже о том, чему они были посвящены. Подобный "склероз" может вызвать ряд проблем для приложений Web, поскольку сервер не способен запоминать из посылаемых клиенту сведений такие важные, как пароли, данные, позиции записей и т.д. Из-за отсутствия такой памяти особенно страдают приложения баз данных, поскольку они часто опираются на знания клиента о том, какая запись является текущей. Протокол HTTP предоставляет базовый метод для записи информации на компьютер клиента позволяющий серверу получить информацию о клиенте из предыдущего ?обмена мнениями? HTTP. Получившие странное имя cookies новые средства (пока назовем их так) позволяют серверу! записать информацию о состоянии в файл жесткого диска клиента, а затем восстановить эту информацию в последующем HTTP-запросе. Это значительно увеличивает возможности сервера по работе с динамическими Web-страницами. Cookies представляет собой не что иное, как некоторое текстовое значение, записанное в формате CookieName=CookieValue. Эти самые Cookies не должны включать точек с запятой или запятых. При этом следует иметь в виду, что пользователь может отказаться от принятия Cookies, поэтому ни одно приложение не должно рассчитывать на обязательное их присутствие. Cookies получают все большее распространение, поскольку Web-узлы становятся все более высокоорганизованными. Если вы пользователь Netscape, вас может попросту удивить содержимое файла COOKIES.ТХТ (пользователи Internet Explorer могут заглянуть в папку \WINDOWS\COOKIES). Что же касается Delphi, то управлять этими Cookies ему, как говорится, сам Бог велел. Классы THTTPRequest и THTTPResponse инкапсулируют их обработку, позволяя легко управлять как установкой новых значений Cookies на компьютере клиента, так и читать ранее записанные значения. Вся работа по установке Cookies выполняется в методе TWebResponse.SetCookieField. Этому методу можно передать параметр типа TStrings, содержащий значения Cookies, а также oграничения на их применение. Метод SetCookieField объявляется в модуле НТТРАРР следующим образом: procedure SetCookieField(Values: TStrings; const ADomain, APath: string; AExpires: TDateTime; ASecure: Boolean); Параметр Values представляет собой потомок класса TStrings (можно также использовать потомок класса TStringList), который содержит реальные строковые значения Cookies. В одном параметре Values можно передать несколько Cookies. С помощью параметра ADomain можно определить, к какому домену относятся данные Cookies. Если значение домена не передается, то Cookies будут переданы каждому серверу, к которому клиент делает запрос. Обычно Web-приложение устанавливает здесь собственный домен, чтобы передавались только подходящие Cookies. Клиент будет оценивать значения существующимх Cookies и возвращать только те из них, которые отвечают заданному критерию. Например, если в параметре ADomain передать домен widgets.com, то все будущие запросы к серверу в домене widgets.com будут передаваться со значением Cookie, установленным с помощью значения этого домена. Другим доменам это значение Cookie передано не будет. Если клиент запрашивает домен big.widgets.com или small.widgets.com, передача Cookie состоится. Koмпьютеры могут устанавливать значения для домена лишь внутри домена, что позволяет избежать возможных недоразумений. С помощью параметра APath можно установить подмножество адресов URL внутри домена, котором Cookie действителен. Параметр APath является подмножеством параметра ADomain. Если домен сервера совпадает с параметром ADomain, то проверяется параметр APath на совпадение с текущим путем запрашиваемого домена. Если параметр APath совпадает с информацией о пути в запросе клиента. Cookie считается действительным. Например (в продолжение предыдущего примера), если бы параметр APath содержал значение /nuts. Cookie был бы действителен для запроса пути widgets.com/nuts и любых вложенных путей, таких как widgets.com/nuts/andbolts. Параметр AExpires определяет, как долго Cookie должен оставаться действительным. В этом параметре можно передать любое значение типа TDateTime. Поскольку клиент может находиться в любой точке земного шара, это значение должно опираться на время GMT. Если вы хотите, чтобы Cookie оставался действительным в течение 10 дней, передайте в качестве параметра AExpires значение Now+10. Если вам нужно удалить Cookie, передайте значение уже прошедшей даты, что сделает его недействительным. При этом заметьте, что, хотя Cookie сам по себе может быть недействительным и не передаваться, это совершенно не означает, что данные на самом деле удаляются из компьютера клиента. Последний параметр ASecure представляет собой значение типа Boolean, которое определяет, может ли Cookie передаваться по незащищенным каналам. Значение True говорит о том, что Cookie может передаваться только через защищенный HTML-протокол (HTTP-Secure protocol) или Secure Sockets Layer. Для обычного использования этот параметр нужно установить равным False. Ваше приложение Web-сервера получает Cookies, посланные клиентом, в свойстве TWebRequest.CookieFields. Оно является потомком класса TStrings, который хранит значения в индексированном массиве. В передаваемых строках содержатся полные значения Cookies, записанные в формате param=value. Доступ к ним осуществляется так же, как и к другим значениям типа TStrings. Cookies можно передать и в качестве одной строки в свойстве TWebRequest.Cookie, но, как правило, это не делается. Cookies можно также прямо присвоить существующему объекту типа TStrings с помощью метода TWebRequest.ExtractCookieFields. Как Delphi справляется с Cookies, можно проиллюстрировать простым примером. Сначала добавьте в инструкцию uses имя модуля WebUtils. Затем создайте новое приложение Web-сервера и включите в него два события Action ? SetCookie и GetCookie. В обработчик события OnAction для SetCookie включите следующий код: procedure
TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled:
Boolean); Код обработчика события OnAction для GetCookie должен выглядеть так: procedure
TWebModule1.WebModule1WebActionItem2Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled:
Boolean); Настройте Web-страницу на вызов следующих двух URL: http://<ваш
cepвep>/projectl.dll/SetCookie; Установите Cookie путем вызова Web-страницы, указав первый URL в одном каталоге с DLL. Тем самым вы установите на компьютере клиента Cookie, который действителен в течение 10 дней и содержит дату и время, соответствующие запросу, зафиксированному в Cookie с именем LastVisit. Если у вас есть Web-броузер, настроенный на прием Cookies, он должен предложить вам подтвердить запись Cookie. Затем вызовите действие GetCookie, чтобы прочитать Cookie, и вы увидите дату и время, соответствующие последнему вызову действия SetCookie. Cookies могут содержать любую информацию, которую можно сохранить в строке. В размерах Cookies могут достигать 4 Кбайт, а один клиент может хранить до 300 Cookies. Отдельный сервер или домен ограничен 20-ю Cookies. Как видите, возможности Cookies не безграничны, а потому их нельзя использовать для хранения больших объемов данных на компьютере клиента. Довольно часто необходимо запомнить информацию, превышающую по объему возможности Cookies. Иногда желательно зафиксировать предпочтения пользователя, адрес, личную информацию или даже содержимое корзины, обычно закупаемой им на вашем электронном торговом узле. Объем такой информации может быстро возрасти, поэтому вместо хранения информации о пользователе в чистом виде можно прибегнуть к ее кодированию. Например, для запоминания в Cookies данных о предпочтениях конкретного пользователя, которые представляют собой значения типа Boolean, можно использовать двоичный формат. Предположим, значение Cookies '1001' может означать, что пользователь желает в дальнейшем обновлять содержимое своего электронного почтового ящика, возражает против передачи его адреса другим пользователям, не хочет, чтобы вы добавили его в список почтовой рассылки подписчиков системы LISTSERV, и хочет присоединиться к вашим интерактивным дискуссионным группам. Для сокращения объемов информации, хранимой в Cookies, подобный способ кодирования можно применить и к другим видам сведений о пользователе. С помощью Cookies можно также хранить идентификационное значение, которое однозначно определяет пользователя. Затем можно считать это значение из Cookies и использовать его для поиска в базе данных информации именно об этом пользователе. Благодаря этому можно минимизировать объем данных, хранимых на компьютере пользователя, и максимизировать возможности управления информацией о пользователях. Таким образом, Cookies представляют собой мощный и в то же время простой способ поддержки данных о пользователях между отдельными HTTP-сеансами. [Листинг с
примером использования Cookies]
| ||||||||||||
За содержание страницы отвечает Гончарова М.Н. © Кафедра СПиКБ, 2002-2017 |