Работа с cookies. Часть 2
Установка cookie
Установка cookie-наборов средствами JavaScript равнозначна установке свойства cookie объекта document. При этом очень важно использовать тот же самый формат протокола HTTP, что и при отправке cookie-набора клиенту. В обычных cookie-наборах, т.е. таких наборах, у которых отсутствует срок действия или другие ограничения, имя и значение cookie должны ббыть разделены знаком равенства. Кроме того, в имени cookie не должно быть таких специальных сиволов, как пробелы и точки с запятой. Специальные символы в значении cookie должны быть закодированы в формате URL, например, пробел обозначается как %20, т.е. в шестнадцатеричном представлении его кода ASCII.
Как показано в приведенном ниже листинге, для установки нескольких cookie достаточно задать соответствующее число значений свойства document.cookie. Следовательно, запись очередного значения в свойстве document.cookie не приводит к перезаписи всех предыдущих cookie, а лишь к добавлению еще одного cookie. Единственное исключение из этого правила: если cookie с этим же именем уже существует, клиент попытается перезаписать его.
document.cookie = "myLanguage=JavaScript";
document.cookie = "myOtherLanguage=PHP:%20Hypertext%20Preprocessor"
</script>
Чтение cookie
При доступе к свойству document.cookie в коде JavaScript извлекается список всех cookie, которые браузер должен отправить обратно текущему серверу. К сожалению, такой доступ возможен только в формате строки, но не массива. Например, приведенный выше пример кода формирует следующее значение свойства document.cookie:
Следовательно, для того, чтобы извлечь cookie из этого значения, необходимо предпринять определенные шаги.
- Разделить строку cookie по символу “;”, чтобы получить отдельные cookie.
- Определить первый знак равенства (=) в каждом cookie в качестве разделителя имени и значения.
Значения cookie могут содержать знаки равенства, поэтому следует использовать первре вхождение знака равенства. В следующем фрагменте кода выводятся все cookie в форме HTML-таблицы.
document.write("<table><tr><th>Name</th><th>Value</th></tr>");
var cookies = document.cookie.split(/; /g);
for (var i=0; i<cookies.length; i++) {
var cookie = cookies[i];
if (cookie.indexOf("=") == -1) {
continue;
}
var name = cookie.substring(0, cookie.indexOf("="));
var value = cookie.substring(cookie.indexOf("=") + 1);
document.write("<tr><td>" +
HtmlEscape(name) +
"</td><td>" +
HtmlEscape(unescape(value)) +
"</td></tr>");
}
document.write("</table>");
function HtmlEscape(s) {
return s.replace(/&/, "&")
.replace(/</, "<")
.replace(/>/, ">")
.replace(/"/, """)
.replace(/'/, "'");
}
</script>
Если же требуется значение одного конкретного cookie, для этой цели можно использовать приведенную ниже вспомогательную функцию. Эта функция осуществляет поиск заданного имени cookie и возвращает его значение, т.е. все, что находится справа от имени cookie вплоть до следующей точки с запятой или конца строки.
function getCookie(name) {
var pos = document.cookie.indexOf(name + "=");
if (pos == -1) {
return null;
} else {
var pos2 = document.cookie.indexOf(";", pos);
if (pos2 == -1) {
return unescape(
document.cookie.substring(pos + name.length + 1));
} else {
return unescape(
document.cookie.substring(pos + name.length + 1, pos2));
}
}
}
alert(getCookie("myLanguage"));
alert(getCookie("myOtherLanguage"));
</script>