Сценарии JavaScript в активных страницах Web© Александр Фролов, Григорий ФроловТом 34, М.: Диалог-МИФИ, 1998, 288 стр. Выполнение основных операций с cookieРассмотрим основные операции с cookie, такие как создание cookie, получение и изменение значений параметров cookies, а также удаление cookie. Создание cookieСуществуют два способа создание cookie, первый из которых используется расширениями сервера Web, а второй - сценариями JavaScript. Мы рассмотрим оба этих способа. Первый способ: создание cookie расширением сервера WebДля того чтобы создать cookie первым способом, расширение сервера Web обычно добавляет в заголовок HTTP динамически создаваемого документа HTML поле с именем Set-Cookie. В этом поле определяются имена и значения параметров cookie. Когда расширение сервера Web вызывается из документа HTML, имеющего cookie, параметры cookie предаются этому расширению через поле Cookie заголовка HTTP и могут быть проанализированы. Заголовок HTTP, предназначенный для создания cookie, выглядит следующим образом: Set-Cookie: Имя=Значение; expires=Дата_GMT; path=Адрес_URL; domain=Домен; secure Описание отдельных полей заголовка Set-Cookie приведено ниже:
Все поля, кроме первых двух (Имя и Значение), необязательны. Дата должна быть записана в формате День_недели, ДД-Мес-ГГ ЧЧ:ММ:СС GMT, где: · День_недели - английское трехбуквенное сокращение названия дня недели (например, Mon); · ДД - номер дня недели; · Мес - английское трехбуквенное сокращение названия месяца (например, Jun); · ГГ - две последние цифры года; · ЧЧ - часы; · ММ - минуты; · СС - секунды Например, дата может быть указана так: Mon, 07-Jun-93 14:45:00 GMT Сделаем небольшое замечание относительно полей domain и path, определяющих условие, при котором выполняется установка cookie. Когда браузер загружает документ HTML с сервера Web и среди заголовков HTTP этого документа присутствует заголовок Set-Cookie, он проверяет возможность установки cookie. В процессе проверки анализируется адрес URL, откуда был загружен этот документ, а также содержимое полей domain и path. Если эти поля не указаны, то по умолчанию считаются, что они соответствуют адресу URL, по которому находится загруженный документ HTML. В этом случае выполняется установка cookie. В том случае, когда указано поле domain, установка cookie выполняется только тогда, когда документ был загружен с сервера Web, принадлежащего данному домену. С помощью параметра path можно установить ограничение на адреса URL в рамках домена, для которых выполняется установка cookie. При этом значение “/” соответствует всем адресам данного домена. Одновременно сервер Web может создать несколько параметров cookie, включив в заголовок документа HTML несколько заголовков Set-Cookie. Второй способ: создание cookie в сценарии JavaScriptВторой способ предполагает использование свойства document.cookie. Это свойство мы упомянули, рассказывая о свойствах и методах объекта document, создаваемого для документа HTML, загруженного в окно браузера. В общем виде сценарий JavaScript может создать cookie следующим образом: document.cookie = "Имя=Значение; Здесь мы просто записываем в свойство cookie объекта document текстовую строку, определяющую cookie. Для пересчета текущей даты в формат GMT в сценариях JavaScript можно использовать встроенные функции, о чем мы скоро расскажем. В качестве примера приведем исходный текст функции addCookie, которую мы будем использовать в своих сценариях для создания cookie:
function addCookie(szName,szValue,dtDaysExpires)
{
var dtExpires = new Date();
var dtExpiryDate = "";
dtExpires.setTime(dtExpires.getTime() +
dtDaysExpires * 24 * 60 * 60 * 1000);
dtExpiryDate = dtExpires.toGMTString();
document.cookie =
szName + "=" + szValue + "; expires=" + dtExpiryDate;
}
Функция addCookie получает три параметра. Через параметр szName передается имя параметра, хранящегося в cookie. Параметр szValue определяет значение этого параметра cookie. Что же касается последнего параметра с именем dtDaysExpires, то он задает интервал времени по отношению к моменту создания cookie, когда этот cookie необходимо удалить. Самое сложное в функции addCookie - это определение даты удаления cookie и преобразование этой даты в формат GMT. Данная задача решается следующим образом. Прежде всего функция addCookie создает объект класса Date с помощью ключевого слова new: var dtExpires = new Date(); Записанная таким образом в переменную dtExpires дата соответствует моменту вызова функции addCookie. Далее с помощью метода getTime функция addCookie определяет текущую дату в миллисекундах и прибавляет к результату значение параметра dtDaysExpires, полученное функцией, умноженное на константу (24 * 60 * 60 * 1000): dtExpires.getTime() + dtDaysExpires * 24 * 60 * 60 * 1000 Константа представляет собой количество часов в сутках, умноженное на количество минут в часе, затем на количество секунд в минуте, и, наконец, на количество миллисекунд в секунде. Результат вычислений записывается при помощи метода setTime в переменную даты dtExpires. Теперь здесь хранится дата автоматического уничтожения cookie браузером. Осталось лишь преобразовать эту дату в формат GMT. Такое преобразование нетрудно сделать с помощью специально предназначенного для этого метода toGMTString, возвращающего текстовую строку в нужном нам формате: dtExpiryDate = dtExpires.toGMTString(); Теперь нам остается только сформировать текстовую строку определения cookie и записать ее в свойство document.cookie: document.cookie = szName + "=" + szValue + "; expires=" + dtExpiryDate; На этом создание cookie завершено. Теперь, когда в вашем распоряжении есть функция addCookie, создание cookie представляет собой очень простую задачу. Например, в следующей строке мы создаем cookie с именем Count, значением 0, причем через 10 дней браузер автоматически удалит этот cookie:
addCookie("Count","0",10);
При необходимости использования других параметров cookie, таких как path или domain, вы можете немного дополнить текст функции addCookie. С этой задачей вы легко справитесь самостоятельно. Получение значения cookieИтак, вы научились создавать cookie в сценариях JavaScript. Теперь решим другую задачу - определение значения параметров cookie. Эта задача сводится к простому сканированию текстовой строки, полученной следующим образом: var szCookieString = document.cookie; В этой строке вам нужно найти подстроку “Имя=Значение;”, а затем извлечь полученное значение. Для облегчения этой работы вы можете воспользоваться функцией findCookie. Исходный текст этой функции приведен ниже:
function findCookie(szName)
{
var i = 0;
var nStartPosition = 0;
var nEndPosition = 0;
var szCookieString = document.cookie;
while(i <= szCookieString.length)
{
nStartPosition = i;
nEndPosition = nStartPosition + szName.length;
if(szCookieString.substring(
nStartPosition,nEndPosition) == szName)
{
nStartPosition = nEndPosition + 1;
nEndPosition =
document.cookie.indexOf(";",nStartPosition);
if(nEndPosition < nStartPosition)
nEndPosition = document.cookie.length;
return document.cookie.substring(
nStartPosition,nEndPosition);
break;
}
i++;
}
return "";
}
После извлечения строки из свойства document.cookie и записи этой строки в переменную szCookieString функция findCookie организует цикл по всем символам этой строки. Условием завершения цикла является просмотр всех szCookieString.length символов. Сравнивая имя параметра с подстрокой, извлеченной из строки szCookieString при помощи метода substring, функция findCookie пытается найти нужный параметр. Если такая попытка оказывается успешной, функция findCookie пропускает символ присваивания, извлекая значение параметра, ограниченное символом точка с запятой. Это значение возвращается функцией findCookie. Если же поиск оказывается неудачным, функция findCookie возвращает пустую строку. Как пользоваться функцией findCookie? Во-первых, с помощью этой функции вы можете проверить, установлен ли для данного документа cookie с заданным именем:
if(findCookie("Visit") == "")
{
// cookie с именем Visit установлен
. . .
}
else
{
// cookie с именем Visit не установлен
. . .
}
Для того чтобы записать в текстовую переменную значение параметра cookie с заданным именем, вы должны сделать следующее:
var szVisitValue = findCookie("Visit");
Как видите, пользоваться функцией findCookie достаточно просто. Изменение значения параметра cookieДля изменения значения параметра cookie с заданным именем вы можете просто вызвать функцию addCookie еще раз:
addCookie("Count","0",10);
// Значение параметра Count равно 0
. . .
addCookie("Count","5",10);
// Значение параметра Count равно 5
Здесь мы вначале установили для параметра Count значение 0, а затем изменили это значение на 5. Удаление cookieСамый простой способ удалить cookie - установить для него такое время автоматического удаления, которое уже прошло. Для этого нужно получить текущую дату, уменьшить ее, например, на одну микросекунду, а затем изменить значение document.cookie. Все это делает функция removeCookie:
function removeCookie(szName)
{
var dtExpires = new Date();
dtExpires.setTime(dtExpires.getTime() - 1);
var szValue = findCookie(szName);
document.cookie = szName + "=" + szValue +
"; expires=" + dtExpires.toGMTString();
}
В последней строке этой функции мы указали такое значение параметра expires, которое вызывает немедленное удаление cookies браузером. Ограничения на использование cookieНа использование cookie накладываются определенные ограничения, которые мы перечислили ниже: · всего может быть создано не более чем 300 cookie; · каждый cookie не может превышать по своему размеру 4 Кбайт; · для каждого домена может быть создано не более 20 cookie Если указанные значения будут превышены, браузер может удалить самые старые cookie или обрезать значения параметров cookie. |

