Cookie

Если требуется сохранить какие-то данные на диске пользователя, чтобы использовать их при следующем посещении Web-страницы, то это можно сделать с помощью механизма cookie. Данные сохраняются в специальных текстовых файлах и имеют некоторую несложную структуру. В IE файлы cookie сохраняются в папке Windows\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-запись:

Набор приведенных выше функций для работы с cookie, вы можете скачать

Вы можете организовать для зарегистрированных посетителей вашего сайта доступ к специальным страницам, предназначенным только для них. В этом случае сценарий проверяет наличие в cookie-файле записи с некоторым фиксированным именем (например, myspecrecord) и читает ее значение, содержащее пароль. Если пароль правильный, то в документ загружается ссылка на защищенный паролем документ, либо сам этот документ. Если такой cookie-записи не нашлось, либо пароль в этой записи не верен, то в документ загружается поле ввода пароля. Если введенный пользователем пароль верен, то сценарий создает cookie-запись с именем myspecrecord и записывает в нее пароль. После этого в текущий документ загружается либо ссылка, либо сам защищенный документ. При следующем посещении этого сайта пользователю не придется снова вводить пароль, поскольку сценарий просто считает его из cookie-записи. Это, конечно, справедливо до тех пор, пока cookie-запись с паролем сохраняется на диске компьютера пользователя. Поэтому ее можно обновлять с помощью сценария, указывая новое значение срока хранения, вычисленное на основе текущей даты (например, текущая дата плюс месяц). Следует заметить, что значение пароля не должно фигурировать в сценарии в явном виде, а записывать пароль в cookie-файл желательно в зашифрованном виде. Несложный алгоритм преобразования пароля вы можете придумать самостоятельно.

Один из возможных способов работы с паролем рассматривается здесь