Работа с cookies. Часть 2

Установка cookie

Установка cookie-наборов средствами JavaScript равнозначна установке свойства cookie объекта document. При этом очень важно использовать тот же самый формат протокола HTTP, что и при отправке cookie-набора клиенту. В обычных cookie-наборах, т.е. таких наборах, у которых отсутствует срок действия или другие ограничения, имя и значение cookie должны ббыть разделены знаком равенства. Кроме того, в имени cookie не должно быть таких специальных сиволов, как пробелы и точки с запятой. Специальные символы в значении cookie должны быть закодированы в формате URL, например, пробел обозначается как %20, т.е. в шестнадцатеричном представлении его кода ASCII.

Как показано в приведенном ниже листинге, для установки нескольких cookie достаточно задать соответствующее число значений свойства document.cookie. Следовательно, запись очередного значения в свойстве document.cookie не приводит к перезаписи всех предыдущих cookie, а лишь к добавлению еще одного cookie. Единственное исключение из этого правила: если cookie с этим же именем уже существует, клиент попытается перезаписать его.

<script type="text/javascript">
document.cookie = "myLanguage=JavaScript";
document.cookie = "myOtherLanguage=PHP:%20Hypertext%20Preprocessor"
</script>

Чтение cookie

При доступе к свойству document.cookie в коде JavaScript извлекается список всех cookie, которые браузер должен отправить обратно текущему серверу. К сожалению, такой доступ возможен только в формате строки, но не массива. Например, приведенный выше пример кода формирует следующее значение свойства document.cookie:

myLanguage=JavaScript;myOtherLanguage=PHP:%20Hypertext%20Preprocessor

Следовательно, для того, чтобы извлечь cookie из этого значения, необходимо предпринять определенные шаги.

  1. Разделить строку cookie по символу “;”, чтобы получить отдельные cookie.
  2. Определить первый знак равенства (=) в каждом cookie в качестве разделителя имени и значения.

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

<script type="text/javascript">
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(/&/, "&amp;")
          .replace(/</, "&lt;")
          .replace(/>/, "&gt;")
          .replace(/"/, "&quot;")
          .replace(/'/, "
&apos;");
}
</script>

Если же требуется значение одного конкретного cookie, для этой цели можно использовать приведенную ниже вспомогательную функцию. Эта функция осуществляет поиск заданного имени cookie и возвращает его значение, т.е. все, что находится справа от имени cookie вплоть до следующей точки с запятой или конца строки.

<script type="text/javascript">
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>

Один комментарий

  1. Sergey:

    Можно ли в Javascript, прочитав куки, определить сколько времени (ему куки) осталось существовать.
    Использовать разницу текущего времени и времени указанному в expires.
    Буду признателен за ответ и скрипт, если это возможно.
    С уважением.
    Сергей.

Оставьте свой отзыв