ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Cookie. Работа с cookie

Cookie

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

По существу, cookie — это единственный способ сохранения данных на диске пользователя, безопасный для него. Как известно, веб-браузеры препятствуют свободному обращению к папкам и файлам на компьютере пользователя. Однако следует помнить, что многие пользователи не любят cookie-записи и всячески их блокируют и уничтожают.

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

Итак, данные в cookie-файлах организованы в виде записей. Каждую такую запись можно представить себе в виде строки, содержащей следующие элементы:

  • имя записи;
  • содержание записи;
  • срок хранения (годности) записи;
  • домен сервера, который создал запись;
  • сведения о необходимости установки безопасного http-соединения для доступа к записям;
  • расположение документов, которым разрешен доступ к записям.

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

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

Для записи данных в cookie-файл с помощью JavaScript используется выражение присвоения строки, содержащей cookie-данные, свойству document.cookie.

При этом важно соблюдать формат строки:

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

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

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

  • cookiеName. Каждая cookie-запись должна иметь имя и строковое значение, которое может быть и пустой строкой. Например, если требуется сохранить слово «Вова» в cookie-записи с именем User_Name, то соответствующее выражение JavaScript будет иметь вид:
  • document.cookie = "User_Name=Bова"

    При выполнении этого выражения браузер пытается найти cookie-запись с таким именем. Если он не находит ее в текущем домене, то создает ее автоматически. Если запись с таким именем уже существует, то браузер заменяет ее данные новыми. Данные в этом элементе cookie-записи не должны содержать точек с запятыми, запятых и пробелов. Чтобы заменить пробелы соответствующими символами (%20), строка с данными предварительно обрабатывается функци ей escape().

  • expires. Срок хранения. Дата и время хранения (годности) cookie-записи должны быть представлены строкой и содержать данные по Гринвичу (GMT). Например, вычислить дату истечения срока хранения записи месяц спустя после текущей даты можно cледующим образом:
  • var expdate = new Date() // создаем объект даты
    var monthFromNow = expdate . getTnme () + (30*24*60*60*1000)// устанавливаем значение даты

    После этого полученную дату следует привести к строковому формату GMT:

    document.cookie= "User_Name=Вова; expires=" + expdate.toGMTString()

    Cookie-запись можно удалить и до истечения заданного срока хранения, установив новый срок, заведомо уже прошедший:

    expdate=Thu, 01-Jan-70 00:00:01 GMT

    Отсутствие срока хранения означает для браузера, что данная cookie-запись является временной и не записывается в файл.

  • path — cookie-записи, производимые компьютером пользователя, имеют путь, принятый по умолчанию (в текущей папке). Однако можно создать копию cookie в другой папке, указав путь к ней в качестве значения этого параметра.
  • domain — для синхронизации cookie-данных с определенным документом или и группой документов браузер выясняет домен текущего документа и помещает в cookie-файл записи, соответствующие этому домену. Если пользователю требуется просмотреть список всех cookie-записей, содержащихся в свойстве document.cookie, то он должен просмотреть все пары "имя-значение", находящиеся в cookie-файле с именем домена текущего документа. Формат представления домена должен охватывать по крайней мере два уровня, например rambler.ru.
  • secure — принимает логические значения (true или false). При создании 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" : "")
}

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

  • name — строка, содержащая имя cookie-записи (обязательный параметр);
  • value — строка, содержащая значение cookie (обязательный параметр);
  • expires — объект даты (Date), содержащий срок хранения cookie-записи; если отсутствует, то после завершения работы браузера cookie-запись удаляется;
  • path — строка, содержащая путь cookie-записи; если не указан, то используется путь вызванного документа;
  • domain — строка, содержащая домен нужной cookie-записи; если не указан, то используется домен вызванного документа;
  • secure — логическое значение (true или false), определяющее необходимость использования безопасного HTTP-соединения.

Обратите внимание, что в теле функции 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>