Работа с Cookie

Cookie

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

Ниже рассматриваются несколько функций на JavaScript для работы с cookie.
Данные cookie, которые можно получить с помощью сценария на JavaScript, представляют собой единственную строку — значение свойства document.cookie. Выбор значений отдельных элементов (параметров) cookie производится на основе анализа содержимого этой строки методами объекта String. Кроме того, если две и более cookie-записи (до 20) соответствуют одному и тому же домену, то в JavaScript они все равно представляются одной строкой и разграничены точкой с запятой и пробелом.

Рассмотрим функцию readCookie(), читающую cookie-данные, соответствующие имени записи name, которое передается этой функции в качестве параметра:

function readCookie(name) { // чтение cookie-данных записи 
var xname = name + "=";
var xlen = xname.length;
var clen = document.cookie.length;
var i = 0;
while(i < clen){
       var j = i + xlen
       if (document.cookie.substring(i, j) == xname)
		return getCookieVal(j)
       i = document.cookie.indexOf(" ",1) + 1;
       if (i == 0)  break
}
return null
}

Функция readCookie(name) возвращает значение cookie-записи с именем name или null, если такая запись не найдена. В теле этой функции использована еще одна, вспомогательная, функция getCookieVal(j), которая возвращает декодированное значение cookie-данных. Декодирование производится с помощью встроенной функции unescape(). Дело в том, что cookie-запись должна представлять собой кодированную строку, полученную путем обработки встроенной функцией escape(), чтобы, в частности, заменить пробелы специальными символами (%20). Вот, код этой функции:

       
function getCookieVal(n){ // вспомогательная функция, вызываемая из readCookie()
var endstr = document.cookie.indexOf(";", n)
if (endstr == -1)
	endstr = document.cookie.length
return unescape(document.cookie.substring(n, endstr))
}

Теперь рассмотрим функцию writeCookie(), позволяющую создать или обновить cookie-запись:

function writeCookie(name, value, expires, path, domain, secure) { // запись cookie
document.cookie = 
name +"=" + escape(value) +
((expires) ? "; expires="  + expires.toGMTString() : "") +
((path) ? "; path=" + path : "") +
((domain) ? "; domain=" + domain : "") +
((secure) ? "; secure" : "")
}
Эта функция принимает параметры:
name — строка, содержащая имя coockie-записи (обязательный параметр);
value — строка, содержащая значение cookie (обязательный параметр);
expires — объект даты (Date), содержащий срок хранения cookie-записи; если отсутствует, 
то после завершения работы браузера cookie-запись удаляется.
path — строка, содержащая путь cookie-записи; если не указан, то используется путь 
вызванного документа;
domain — строка, содержащая домен нужной cookie-записи; если не указан, то 
используется домен вызванного документа;
secure — логическое значение (true или false), определяющее необходимость 
использования безопасного соединения.

Обратите внимание, что в теле функции writeCookie() происходит кодирование значения параметра value с помощью встроенной функции escape(). Для удаления cookie-записи можно использовать следующую функцию:

function deleteCookie(name, path, domain) {	// удаление cookie-записи
if (readCookie(name)) {
	document.cookie =
	name +"=" +
	((path) ? "; path=" + path : "") +
	((domain) ? "; domain="+domain : "") +
	"; expires=Thu, 01-Jan-70 00:00:01 GMT"
}
}
Эта функция устанавливает дату срока хранения cookie-записи так, что запись будет удалена. Параметр path должен иметь такое же значение, которое использовалось при создании cookie-записи или иметь пустое значение (null), если при создании записи он не был определен. Таким же образом задается значение параметра domain. Советую вам поэкспериментировать с чтением, созданием и удалением cookie- записей. При этом нужно иметь в виду, что созданные или измененные cookie-записи будут записаны на диск только после закрытия браузера. До этого записи существуют лишь в кэше (оперативной памяти). С другой стороны, cookie-записи загружаются в оперативную память и становятся доступны как значение свойства document.cookie только при запуске браузера. Ниже приводится HTML-код для эксперимента со сценарием, записывающим и читающим cookie-запись:
<html>
<script type="text/javascript">
function readCookie(name) { // чтение cookie-данных записи 
… // код
}

function getCookieVal(n){ // вспомогательная функция, вызываемая из readCookie()
… // код
}

function writeCookie(name, value, expires, path, domain, secure) { // запись cookie
… // код
}

/ * Срок хранения — 1 год от текущей даты: */
var d1 = new Date();
var d2 = d1.getTime() + (365*24*60*60*1000);
d1.setTime(d2);
/* Запись и чтение cookie: */
writeCookie("myrecord","Привет",d1);
alert(readCookie("myrecord"));
</script>
</html>
Набор приведенных выше функций для работы с cookie, вы можете скачать