Запись и чтение
Cookies
Стартовые страницы некоторых Web-узлов (например, компании
Microsoft) допускают настройку в соответствии с требованиями пользователя. Как это делается? Каким образом сервер хранит информацию о настройках, выполненных отдельными пользователями, в перерывах между сеансами? Если бы каждый пользователь имел фиксированный IP-адрес, можно было бы (хотя вряд ли это разумно) создать базу данных с IP-адресами и настройками для каждого пользователя. IP-адрес клиентского компьютера хранится в семействе ServerVariables объекта Server. Однако адреса клиентов изменяются от сеанса к сеансу. Поэтому единственный способ сохранить информацию о каждом отдельном клиенте — это ее запоминание на клиентском компьютере и считывание необходимых данных при подключении клиента к серверу. Запоминание этой информации в специальной папке на клиентском компьютере осуществляет броузер. Причем хранится она в cookie.
Примечание
Термин Cookies пришел из операционной системы Unix. Даже не пытайтесь понять, какое это имеет отношение к вашему компьютеру.
Cookies используются для обмена информацией между отдельными страницами одного узла. Предположим, необходимо создать Web-узел для пользователей, работающих в режиме
on-line. Узел может содержать множество страниц, и пользователь должен иметь возможность запрашивать данные с каждой из них. Каким образом сохранить информацию о том, к каким страницам обращался пользователь? Ведь каждая страница может иметь свой собственный сценарий и переменные, областью видимости которых она является. Протокол HTTP работает так: когда на клиентский компьютер поступает новая страница, броузер "забывает" всю информацию о текущей странице кроме ее URL (чтобы была возможность при необходимости вернуться к ней). И здесь весьма кстати оказываются cookies, в которых можно сохранить информацию с предыдущих страниц и организовать обмен данными между страницами одного узла.
Поскольку обработку cookies осуществляет броузер, Web-страницы не имеют прямого доступа к вашему жесткому диску: в этом смысле cookies являются безопасными. Когда страница запрашивает данные из cookies, броузер отслеживает, чтобы использовались только cookies, созданные страницами того же узла. То есть, если некоторые cookies созданы Web-узлом компании Microsoft, то их не могут прочесть страницы, принадлежащие другим узлам.
Cookies могут иметь "срок годности". Те из них, которые его не имеют, прекращают свое существование по окончании сеанса. В противном случае они остаются на клиентском компьютере до истечения этого срока.
Для записи cookies на клиентский компьютер используется свойство Cookies объекта Response. Свойство Cookies является семейством, его члены можно создавать и осуществлять к ним доступ по именам. Для создания нового cookie используется следующий оператор.
<% Response. Cookies ("FavoriteSport") ="Hockey" %>
Если cookie с именем FavoriteSport
уже существует на клиентском компьютере, его значение перезаписывается. В противном случае создается новый cookie, который существует до конца текущего сеанса.
Срок жизни cookie определяется с помощью его свойства Expires.
<% Response.Cookies ("FavoriteSport") .Expires = "December 31, 1998
12:00:00 GTM" %>
Другие свойства cookies перечислены ниже.
Domain (Домен).
Если значение этого свойства установлено, то данные этого cookie передаются только в ответ на запросы, поступившие из того же домена. Используется вместе со свойством Path.
Path (Путь). Если значение этого свойства установлено, то данные этого cookie передаются только в ответ на запросы, поступившие от страниц, находящихся на сервере в указанном пути.
HasKeys (Имеет ключи).
Указывает, имеет ли cookie множественные ключи (т.е. является словарем). Это свойство имеет атрибут "только для чтения".
Чтобы создать cookie с ключами, следует использовать имя одного cookie при установке нескольких атрибутов.
<%
Response.Cookies ("Preferences") ("Books") = "Mystery"
Response.Cookies ("Preferences") ("News") = "Sports"
%>
Для чтения значений из cookie на клиентском компьютере используется семейство Cookies объекта Response. Количество cookie в семействе возвращается свойством Request.Cookies. Count.
Для сканирования элементов семейства используется цикл For...Next либо For Each...Next.
<%
For Each cookie In Request.Cookies
{ обработка текущего cookie, которым является Request.Cookies(cookie)}
Next cookie
%>
Обычно серверному сценарию известны имена cookies, поэтому доступ к ним можно осуществлять по именам.
BookType = Request.Cookies ("FavoriteSport")
При необходимости можно выяснить имена cookies, воспользовавшись циклом For Each...Next. На каждой итерации цикла значение переменной cookie
является именем очередного cookie, а переменная Request. Cookies(cookie) — его значением.
Если cookie имеет ключи, то доступ к ним осуществляется как к элементам семейства. Предположим, вы передали cookie, имеющий ключи, на клиентский компьютер.
<%
Response.Cookies ("Background") = "Planets.bmp"
Response.Cookies ("Preferences") ("Books") = "Mystery"
Response.Cookies ("Preferences") ("News") = "Sports"
%>
Первый cookie задает узор фона, который предпочитает пользователь. Пара следующих значений используется для создания стартовой страницы. Цикл, который читает все значения cookie, включая ключи, приведен ниже.
<%
For Each cookie In Request.Cookies
If Request.Cookies(cookie).HasKeys Then
For Each scookie In Request.Cookies(cookie)
{Обработка текущего cookie. Его значением является Request.Cookies(cookie)(scookie) }
Next
Else
{ Обработка текущего cookie. Его значением является Request.Cookies(cookie)}
End If
Next
%>
Организация обмена данными между страницами - далеко не единственное применение cookies. Каждый узел, имеющий настраиваемую стартовую страницу, использует их для хранения информации о пользователях. Некоторые Web-узлы используют cookies для запоминания информации о темах, обращение к которым происходит чаще всего.