Работа с cookie

Для хранения какой-либо информации на стороне клиента (в браузере) используются cookie. Они представлены в виде пары имя=значение. А также для cookie можно установить дополнительные параметры (срок действия и т.п.).

DOM-интерфейс позволяет работать с cookie. Для добавления и получения cookie используется свойство document.cookie.

Добавление cookie

Чтобы добавить новый cookie, свойству document.cookie присваивается строка, содержащая необходимую информацию о cookie. За одно присвоение можно добавить только один cookie. Строка должна быть в виде имя=значение. Имя cookie и его значение не должны содержать запятые, точки с запятой или пробельные символы. Поэтому их предварительно необходимо закодировать с помощью метода encodeURIComponent().

Дополнительно в строке со значением cookie через точку с запятой могут быть указаны его параметры:

domain
Домен, на котором доступен cookie. Если не указан, тогда по умолчанию используется домен текущего расположения документа (но не включая поддомены). В отличие от более ранних спецификаций, ведущие точки в доменных именах игнорируются. Если домен указан, поддомены всегда включены.
path
Директория, в которой может быть использован cookie, то есть страница должна находиться внутри указанной директории, чтобы иметь доступ к cookie. Если путь не указан, тогда по умолчанию используется директория, в которой находится текущий документ. Можно указывать только абсолютный путь, но при этом домен не указывается. Например, path=/docs сделает cookie доступным на любой странице внутри директории example.ru/docs/. Чтобы cookie был доступен в любом месте сайта, надо указать path=/, что соответсвует директории example.ru/.
expires
Время, до которого хранится и может использоваться cookie. Указывается время по Гринвичу в формате Wdy, DD Mon YYYY HH:MM:SS GMT. Если указанное время уже прошло, тогда cookie не установится. По умолчанию, если время не указано, cookie хранится до окончания сессии, то есть до закрытия браузера.
max-age
Время, до которого хранится и может использоваться cookie. Время указывается в секундах от текущего времени. По истечении указанного времени cookie будет удалён. Если установить значение 0, то cookie будет удалён немедленно.
secure
Логический параметр, отвечающий за то, как передаётся cookie по сети. По умолчанию, если параметр не указан, cookie передаётся при любом соединении, включая незащищённое HTTP-соединение. Если указать данный параметр, то cookie будет передаваться только при безопасном соединении (HTTPS или т.п.).

Существует ещё один параметр для cookie. Это логический параметр HttpOnly, который запрещает браузеру работать с данным cookie. Такие cookie могут только отправляться на сервер.

Установить параметр HttpOnly с помощью JavaScript нельзя.

Каждый cookie характеризуется тремя значениями: его имя и параметры domain и path. Добавление cookie, у которого хотя бы одно из данных значений отличается от уже установленного, приведёт к созданию нового cookie. При этом могут появиться cookie с одинаковыми именами, но отличающимися параметрами domain или path.

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

Примеры использования параметров при установке cookie:

// Все параметры имеют значение по умолчанию
document.cookie = 'cookie_name=cookie_value';
// cookie доступен в любых директориях основного домена и его поддоменов
document.cookie = 'cookie_name=cookie_value; domain=example.ru; path=/';
// cookie передаётся только по безопасному соединению, но время находится в прошлом, поэтому cookie не установится
document.cookie = 'cookie_name=cookie_value; expires=Sun, 10 Jan 2016 23:32:15 GMT; secure';
// cookie удалится через час
document.cookie = 'cookie_name=cookie_value; max-age=3600';

Получение cookie

Получить значение установленного cookie можно из свойства document.cookie. В нём содержится строка, состоящая из пар имя=значение, разделённых точками с запятой:

'имя1=значение1; имя2=значение2; имя3=значение3'

На данной странице document.cookie можно посмотреть, нажав на кнопку:

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

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

Параметры установленных cookie получить нельзя.

Редактирование cookie

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

<script>
document.cookie = 'example_cookie=old_value';
alert(document.cookie); // example_cookie=old_value
document.cookie = 'example_cookie=new_value';
alert(document.cookie); // example_cookie=new_value
</script>

Однако, не все параметры можно изменить. При попытке добавить cookie, у которого значение domain или path отличается от уже установленного, установится новый cookie. При этом старый cookie тоже останется. Поэтому при смене значений domain или path старый cookie следует удалить самостоятельно.

Удаление cookie

Удаление cookie выполняется посредством изменения времени его жизни. Это делается изменением одного из параметров max-age или expires. Для expires указывается время в прошлом:

'expires=Thu, 01 Jan 1970 00:00:00 GMT'

Или max-age устанавливается равным 0:

'max-age=0'

Для изменения cookie необходимо знать значения domain и path, которые использовались при установке. В противном случае удалить cookie не удастся.

Объект для работы с cookie

Ниже приведён объект, который позволяет добавлять или получать значения cookie, а также удалять их.

<script>
var Cookie = {
  set: function (str_name, str_value, var_expires, str_path, str_domain, bool_secure) {
    if (!str_name) {
      return false;
    }
    var str_expires = '';
    if (var_expires) {
      if (typeof var_expires == 'number') {
        if (var_expires === Infinity) {
          str_expires = '; expires=Tue, 19 Jan 2038 03:14:07 GMT';
        } else {
          str_expires = '; max-age=' + var_expires;
        }
      } else if (typeof var_expires == 'string') {
        str_expires = "; expires=" + var_expires;
      } else if (typeof var_expires == 'object') {
        str_expires = "; expires=" + var_expires.toUTCString();
      }
    }
    document.cookie = encodeURIComponent(str_name) + '='
      + (str_value ? encodeURIComponent(str_value) : '')
      + str_expires
      + (str_path ? '; path=' + str_path : '')
      + (str_domain ? '; domain=' + str_domain : '')
      + (bool_secure ? '; secure' : '');
    return true;
  },
  get: function (str_name) {
    if (!str_name) {
      return false;
    }
    var arr = document.cookie.match(
      new RegExp('(?:^|; )'
        + encodeURIComponent(str_name).replace(/[\-\.\*\(\)\']/g, '\\$&')
        + '\\=([^;]*)')
    );
    return arr ? decodeURIComponent(arr[1]) : null;
  },
  remove: function (str_name, str_path, str_domain) {
    if (!str_name || (this.get(str_name) === null)) {
      return false;
    }
    document.cookie = encodeURIComponent(str_name)
      + '=; max-age=0'
      + (str_path ? '; path=' + str_path : '')
      + (str_domain ? '; domain=' + str_domain : '');
    if (this.get(str_name) === null) {
      return true;
    } else {
      return false;
    }
  }
};
</script>

Добавление cookie

Для установки cookie используется метод Cookie.set().

Cookie.set(имя[, значение[, истекает[, путь[, домен[, безопасность]]]]])
имя
Строка, содержащая имя cookie.
значение
Необязательный аргумент. Строка, содержащая новое значение cookie.
истекает
Необязательный аргумент. Время, когда истекает срок действия cookie. Варианты значений:
  • Infinity - для установки cookie навсегда.
  • Количество секунд, через которое cookie удалится.
  • Строка в формате GMT.
  • Объект даты.
путь
Необязательный аргумент. Строка, содержащая значение параметра path, или null.
домен
Необязательный аргумент. Строка, содержащая значение параметра domain, или null.
безопасность
Необязательный аргумент. Булевое значение, определяющее необходимость использования безопасного соединения.

Данный метод возвращает false, если вызван без аргументов. Если установка cookie выполнена, то возвращается true.

Получение cookie

Чтобы получить значение cookie, используется метод Cookie.get().

Cookie.get(имя)
имя
Строка, содержащая имя cookie.

Данный метод возвращает false, если вызван без аргументов. Если cookie существует, то возвращается его значение, иначе возвращается null.

Удаление cookie

Для удаления cookie используется метод Cookie.remove().

Cookie.remove(имя[, путь[, домен]])
имя
Строка, содержащая имя cookie.
путь
Необязательный аргумент. Строка, содержащая значение параметра path, или null.
домен
Необязательный аргумент. Строка, содержащая значение параметра domain, или null.

Данный метод возвращает false в случаях, если:

  • вызван без аргументов.
  • cookie с таким именем отсутствует.
  • не удалось удалить cookie.

Если cookie успешно удалён, то возвращается true.

Пример работы методов

<script>
alert(Cookie.set('cook[1]', 'value{1}', 3600, '/')); // true - cookie добавлен
alert(Cookie.get('cook[1]')); // value{1}
alert(Cookie.remove('cook[1]', '/')); // true - cookie удалён
alert(Cookie.get('cook[1]')); // null - cookie с таким именем не существует
</script>