Cookie. Работа с cookie

Для хранения небольших объемов информации на диске компьютера пользователя, в браузере предусмотрен так называемый механизм cookie. Обычно он используется для хранения имени пользователя и пароля, который вводится в поле формы защищенного веб-сайта, а также информации о предыдущем посещении сайта. Например, можно сохранить на диске дату последнего посещения сайта данным пользователем. При загрузке сайта эта дата сравнивается с некоторой датой, установленной автором сайта в качестве даты обновления. Если вторая (авторская) дата более поздняя, чем первая, то на веб-странице появляется соответствующая отметка, например текст или изображение с надписью «New» или "Обновлено". Сравнение дат и вывод на страницу отметки производится с помощью сценария. А вот еще один пример: сценарий проверяет, а посетил ли сайт определенный пользователь; если это произошло, то на страницу выводится персональное сообщение.
По существу, cookie — это единственный способ сохранения данных на диске пользователя, безопасный для него. Как известно, веб-браузеры препятствуют свободному обращению к папкам и файлам на компьютере пользователя. Однако следует помнить, что многие пользователи не любят cookie-записи и всячески их блокируют и уничтожают.

Записи cookie браузер Internet Explorer сохраняет в отдельных текстовых файлах, расположенных в папке Cookies. Имя такого файла образуется на основе имени пользователя и домена того сервера, на котором создавался cookie-файл. Netscape Navigator 4 для Windows создает просто один файл cookie.txt. Вообще говоря, структура данных в cookie-файлах для различных браузеров не столь существенна, поскольку, во-первых, не рекомендуется открывать и изменять эти файлы в текстовых редакторах, а во-вторых, браузеры IE и NN используют одинаковый синтаксис чтения и записи cookie-данных, основанный на использовании свойства document.cookie.
Итак, данные в cookie-файлах организованы в виде записей. Каждую такую запись можно представить себе в виде строки, содержащей следующие элементы:

           

Зависимость записей от домена обеспечивает безопасность хранения так называемых невосстанавливаемых паролей (пар вида имя_пользователя-пароль)поскольку запись, созданную сервером одного домена, не может прочитать сервер с другим доменом.

Срок хранения используется браузером для автоматического удаления просроченных записей, чтобы предотвратить чрезмерное разрастание объема cookie-файлов. Впрочем, IE4+ и NN4+ ограничили объем cookie-файлов 20 записями на каждый домен.
Для записи данных в cookie-файл с помощью JavaScript используется выражение присвоения строки, содержащей cookie-данные, свойству document.cookie. При этом важно соблюдать формат строки:

document.cookie = "cookiеName=данные
[; expires=
строка_времени_GMT]
[; path=
путь]
[; domain=
домен]
[; secure] "

Здесь квадратные скобки указывают, что заключенное в них содержимое не является обязательным (может быть опущено).

Рассмотрим элементы cookie-строки.

Функции чтения, записи данных и удаления cookie

Данные cookie, которые мож¬но получить с помощью сценария на JavaScript, представляют собой единственную строку – значение свойства document.сookie. Выбор значений отдельных элементов (параметров) cookie производится на основе анализа содержимого этой строки методами объекта String. Кроме того, если две и более cookie-записи (до 20) соответствуют одному и тому же домену, то в JavaScript они все равно представляются одной строкой и разграничиваются, точкой с запятой и
пробелом.
Рассмотрим функцию readCookie(name), читающую 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" : "")
}

Эта функция принимает следующие параметры:

                                        

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

Для удаления cookie-записи можно использовать следующую функцию:

function deleteCookie(name, path, domain) { /* удапение cookie-записи */

if (readCookie(name) ) {
document . cooki e =
name + "=" +
((path) ? "; path=" + path : "") +
((domain) ? "; domain="+domain : "") +
"; expires=Thu, Ol-Jan-7 0 00:00:01 GMT"
}

}

Эта функция устанавливает дату срока хранения cookie-записи так, что запись будет удалена. Параметр path должен иметь такое же значение, которое использовалось при создании cookie-записи, или иметь пустое значение (null), если при создании записи он не был определен. Таким же образом задается значение параметра domain.
А теперь поэксперементируем с чтением, созданием и удалением cookie-записей . При этом следует иметь в виду, что созданные или измененные cookie-записи будут записаны на диск только после закрытия браузера.
До этого записи существуют лишь в кэше (оперативной памяти). С другой стороны, cookie-записи загружаются в оперативную память и становятся доступны как значение свойства только при запуске браузера.
Создадим HTML-код для эксперимента со сценарием, записывающим и читающим cookie-запись.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Работа с cookie</title>
<script language="JavaScript">
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
}

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

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" : "")
}
/*Срок хранения- 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>

</head>

<body>
<h2>Работа с cookie</h2>
</body>
</html>




  • Другие |
назадвверхвперед
Rambler's Top100