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