Сценарии 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. |