Работа с 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>