Кука/cookie это небольшой блок информации, сохраняемый на клиентской машине в файле cookies.txt. В этом приложении рассматривается реализация кук в клиентском браузере Navigator; это не формальная спецификация или стандарт.
cookie
объекта
document
.client
, используя
клиентскую технику работы с куками.Об использовании кук в серверном JavaScript см. книгу Серверный JavaScript. Руководство.
Мы рассмотрим формат информации куки в шапке/header HTTP и обсудим использование программ CGI и JavaScript для манипулирования куками.
Программа CGI использует следующий синтаксис для добавления куки-информации в шапку HTTP:
Set-Cookie:
name=value
[;EXPIRES=dateValue]
[;DOMAIN=domainName]
[;PATH=pathName]
[;SECURE]
name
=value
это последовательность символов, кроме точки с запятой, запятой и пробела.
Чтобы поместить неразрешённые символы в name
или в value
,
используйте метод кодирования, такой как URL-style %XX encoding.
EXPIRES=dateValue
специфицирует
строку-дату, которая определяет период действия куки. При достижении даты
окончания действия, кука не будет больше храниться или выдавать информацию. Если
Вы не специфицировали dateValue
, кука перестаёт действовать при окончании сессий пользователя.
Строка даты форматируется так:
Wdy, DD-Mon-YY HH:MM:SS GMT
где Wdy
это день недели (например, Mon или Tues); DD
это день/число месяца из двух цифр; Mon
это трёхбуквенное
сокращение названия месяца, как всегда - на английском языке,
(например, Jan или Feb); YY
это последние две цифры года;
HH:MM:SS
это часы, минуты и секунды, соответственно.
DOMAIN=domainName
специфицирует атрибуты домена для правильной куки.
См. "Определение Действующей Куки". Если Вы не специфицируете
domainName
, Navigator использует имя хоста сервера, который генерирует куку-ответ.
PATH=pathName
специфицирует атрибуты пути для правильной куки.
См. "Определение Действующей Куки". Если Вы не специфицируете значение
pathName
, Navigator использует путь документа, который создал
свойство куки (или путь документа, описанный шапкой HTTP - для программирования CGI).
SECURE
специфицирует, что кука пересылается только в том
случае, если канал связи с хостом использует защиту. Только HTTPS (HTTP через
SSL) серверы являются защищёнными в настоящее время. Если SECURE
не специфицируется, кука может пересылаться по любому каналу.
Сервер высылает куки-информацию клиенту в шапке/header HTTP, когда сервер отвечает на запрос. В эту информацию включается описание диапазона URL, для которых она действует. Любые последующие HTTP-запросы, сделанные клиентом, которые попадают в этот диапазон, будут включать передачу текущего значения объекта статуса с клиента обратно на сервер.
Приложения различных типов могут использовать преимущества кук. Например, приложение-продавец может сохранять информацию о выбранном элементе для использования затем в текущей или в последующих сессиях, а другие приложения могут сохранять пользовательские настройки клиентской машины.
При поиске в списке кук действующих кук, сравнение атрибутов домена в куке выполняется с именем хоста, с которого URL запрашивается.
Если атрибут домена совпадает с концом полного квалифицированного доменного
имени хоста, совпавший путь проверяется на предмет необходимости отправки куки. Например, атрибут домена
royalairways.com
совпадает с именами хоста anvil.royalairways.com
и ship.crate.royalairways.com
.
Только хосты в специфицированном домене могут
отправлять куки для домена. Кроме этого, доменные имена обязаны использовать как
минимум две или три точки. Любой домен категорий COM
, EDU
, NET
, ORG
, GOV
,
MIL
и INT
требует только двух точек; все остальные
домены требуют как минимум трёх точек.
PATH=pathName
специфицирует URL'ы
домена, для которых кука действует. Если кука уже прошла совпадение с доменом,
то компонент pathname из URL сравнивается атрибутом path и, если совпадение есть,
кука считается действующей и высылается вместе с URL запроса. Например, PATH=/foo
совпадает с /foobar
и с /foo/bar.html
. Путь "/"
это самый распространённый путь.
При запросе URL с HTTP-сервера браузер сопоставляет этот URL со всеми существующими куками. Если кука совпадает с URL запроса, строка, содержащая пары имя/значение всех совпадающих кук, включается в HTTP-запрос в следующем формате:
Cookie: NAME1=OPAQUE_STRING1; NAME2=OPAQUE_STRING2 ...
Один серверный ответ может давать несколько шапок Set-Cookie. Сохранение куки
с теми же значениями PATH
и NAME
, что и у существующей куки, перезаписывает
существующую куку. Сохранение куки с тем же значением PATH
, но с
другим значением NAME
, добавляет новую куку.
Значение EXPIRES
указывает, когда зачистить отображение.
Navigator также удалит куку перед истечением срока её действия, если количество
кук превысит внутренний лимит.
Кука с более высоким уровнем значения PATH
не переопределяет более специфическое значение PATH
. Если имеются
несколько совпадений с различными путями, высылаются все совпавшие куки, как показано далее в примерах.
Скрипт CGI может удалить куку, возвращая куку с теми же значениями PATH
и NAME
и значением EXPIRES
, которое было ранее. Поскольку
PATH
и NAME
обязаны совпадать точно, для скрипта, отличного от создателя куки, будет затруднительно удалить её.
При отправке куки на сервер, все куки с более специфицированным отображением пути высылаются до кук с менее специфицированным отображением пути. Например, кука "name1=foo" с отображением пути "/" должна быть выслана после куки "name1=foo2" с отображением пути "/bar", если они обе высылаются.
Navigator может получать и сохранять следующее:
OPAQUE_STRING
комбинируются для
образования лимита в 4 килобайта.Когда лимит в 300 кук или 20 на сервер превзойдён, Navigator удаляет самые старые куки. Когда обнаруживается кука размером более 4 КВ, она должна быть усечена, но имя должно остаться без изменения, если оно менее 4 КВ.
Следующие примеры иллюстрируют последовательность транзакций типичных CGI-программ.
Клиент запрашивает документ и получает в ответе:
Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday,
09-Nov-99 23:12:40 GMT
Если клиент запрашивает URL с путём "/" на данном сервере, он отправляет:
Cookie: CUSTOMER=WILE_E_COYOTE
Клиент запрашивает документ и получает в ответе:
Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/
Если клиент запрашивает URL с путём "/" на данном сервере, он отправляет:
Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001
Set-Cookie: SHIPPING=FEDEX; path=/foo
Если клиент запрашивает URL с путём "/" на данном сервере, он отправляет:
Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001
Если клиент запрашивает URL с путём "/foo" на данном сервере, он отправляет:
Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001;
SHIPPING=FEDEX
Здесь предполагается, что все отображения из Примера 1 очищены.
Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/
Если клиент запрашивает URL с путём "/" на данном сервере, он отправляет:
Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001
Set-Cookie: PART_NUMBER=RIDING_ROCKET_0023; path=/ammo
Если клиент запрашивает URL с путём "/ammo" на данном сервере, он отправляет:
Cookie: PART_NUMBER=RIDING_ROCKET_0023;
PART_NUMBER=ROCKET_LAUNCHER_0001
Имеются две пары имя/значение с именем "PART_NUMBER" из-за наследования отображения "/" в дополнение к отображению "/ammo".
Дата последнего обновления: 28 мая 1999 года.
Copyright (c) 1999