Чтение онлайн

ЖАНРЫ

JavaScript. Подробное руководство, 6-е издание
Шрифт:

По умолчанию cookies доступны только страницам с общим происхождением. Однако большим веб-сайтам может потребоваться возможность совместного использования cookies несколькими поддоменами. Например, серверу order.examp-le.com может потребоваться прочитать значения cookie, установленного сервером

catalog.example.com. В этой ситуации поможет атрибут domain. Если cookie, созданный страницей с сервера catalog.example.com, имеет в атрибуте path значение «/», а В атрибуте domain - значение «.example.com», этот cookie будет доступен всем веб-страницам в поддоменах catalog.example.com, orders.example.com и в любых других поддоменах в домене example.com. Если атрибут domain не установлен, его значением по умолчанию будет имя

веб-сервера, на котором находится страница. Обратите внимание, что в атрибут domain нельзя записать значение, отличающееся от домена вашего сервера.

Последний атрибут cookie - это логический атрибут с именем secure, определяющий, как значения cookie передаются по сети. По умолчанию cookie не защищен, т.е. передается по обычному незащищенному HTTP-соединению. Однако если cookie помечен как защищенный, он передается, только когда обмен между броузером и сервером организован по протоколу HTTPS или другому защищенному протоколу.

20.2.2. Сохранение cookies

Чтобы связать временное значение cookie с текущим документом, достаточно присвоить его свойству

cookie
строку следующего формата:

имя=значение

Например:

document.cookie = "version=" + encodeURIComponent(document.lastModified);

При следующем чтении свойства

cookie
сохраненная пара имя/значение будет включена в список cookies документа. Значения cookie не могут содержать точки с запятой, запятые или пробельные символы. По этой причине для кодирования значения перед сохранением его в cookie, возможно, потребуется использовать глобальную JavaScript-функцию
encodeURIComponent.
В этом случае при чтении значения cookie надо будет вызвать соответствующую функцию
decodeURIComponent.

Записанный таким способом cookie сохраняется в течение сеанса работы веб-броузера, но теряется при его закрытии пользователем. Чтобы создать cookie, сохраняющийся между сеансами броузера, необходимо указать срок его хранения (в секундах) с помощью атрибута

max-age
. Это можно сделать, присвоив свойству cookie строку следующего формата:

имя=значение; max-аgе=число_ секунд

Следующая функция устанавливает cookie с дополнительным атрибутом

max-аgе
:

// Сохраняет пару имя/значение в виде cookie, кодируя значение с помощью

// encodeURIComponent, чтобы экранировать точки с запятой, запятые и пробелы.

// Если в параметре daysToLive передается число, атрибут max-age

// устанавливается так, что срок хранения cookie истекает через

// указанное число дней. Если передать значение 0, cookie будет удален,

function setCookie(name, value, daysToLive) {

var cookie = name + "=" + encodeURIComponent(value);

if (typeof daysToLive === "number")

cookie += max-age=" + (daysToLive*60*60*24);

document.cookie = cookie;

}

Аналогичным

образом можно установить атрибуты path, domain и secure, дописав к значению cookie строки следующего формата перед его записью в свойство cookie:

; path=путь

; domain=домен

; secure

Чтобы изменить значение cookie, установите его значение снова, указав то же имя, путь, домен и новое значение. При изменении значения cookie можно также переопределить срок его хранения, указав новое значение в атрибуте

max-age
.

Чтобы удалить cookie, установите его снова, указав то же имя, путь, домен и любое произвольное (возможно пустое) значение, а в атрибут

max-age
запишите 0.

20.2.3. Чтение cookies

Когда свойство

cookie
используется в JavaScript-выражении, возвращаемое им значение содержит все cookies, относящиеся к текущему документу. Эта строка представляет собой список пар имя = значение, разделенных точками с запятой и пробелами. Значение не включает какие-либо атрибуты, которые могли быть установлены для cookie. При работе со свойством
document.cookie
обычно приходится использовать метод
split,
чтобы разбить его значение на отдельные пары имя/значение.

После извлечения значения cookie из свойства

cookie
его требуется интерпретировать, основываясь на том формате или кодировке, которые были указаны создателем cookie. Например, cookie можно передать функции
decodeURIComponent,
а затем функции
JSON.parse.

В примере 20.1 определяется функция

getCookie,
которая анализирует свойство
document.cookie
и возвращает объект, свойства которого соответствуют парам имя/значение всех cookies в документе.

Пример 20.1. Анализ свойства

document.cookie

// Возвращает cookies документа в виде объекта с парами имя/значение.

// Предполагается, что значения cookie кодируются с помощью

// функции encodeURIComponent.

function getCookies {

var cookies = {}; // Возвращаемый объект

var all = document.cookie; // Получить все cookies в одной строке

if (all === "") // Если получена пустая строка,

return cookies; // вернуть пустой объект

var list = all.split("; "); // Разбить на пары имя/значение

for(var і = 0; і < list.length; i++) { // Для каждого cookie

Поделиться с друзьями: