Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Что такое cookies и как с ними работать.docx
Скачиваний:
2
Добавлен:
08.05.2019
Размер:
552.79 Кб
Скачать

Пример работы с cookie

Пример 16.1 объединяет все аспекты cookie, которые мы до сих пор обсуждали. Сначала пример определяет класс Cookie. При создании объекта Cookie вы указываете объект Document, имя cookie и (необязательно) время окончания действия, путь, домен и логическое значение, указывающее, должен ли cookie быть защищен. После создания объекта Cookie можно установить в этом объекте произвольные строковые свойства. Значения этих свойств – это значения, которые будут храниться в cookie. Класс Cookie определяет три метода. Метод store() обходит в цикле все определенные пользователем свойства объекта Cookie и конкатенирует их имена и значения в одну строку, выступает в качестве значения cookie. Метод load() объекта Cookie читает свойство cookie объекта Document для получения значений всех cookie данного документа. Он ищет в этой строке значение cookie с указанным именем и затем разбивает это значение на отдельные имена и значения, которые хранятся в качестве свойств объекта Cookie. И наконец, метод remove() объекта Cookie удаляет указанный cookie из документа. За определением класса Cookie в примере 16.1 следует полезный и изящный способ использования cookie. Код этого примера несколько сложен, но стоит тщательного изучения. Можно начать с тестовой программы в конце примера, иллюстрирующей типичное применение класса Cookie. Пример 16.1. Вспомогательный класс для работы с cookie <script language="JavaScript1.1"> // Функция-конструктор: создает объект Cookie для указанного документа с // указанным именем и необязательными атрибутами. // Аргументы: // document: Объект Document, для которого сохраняется cookie. Обязательный. // name: Строка, задающая имя cookie. Обязательный. // hours: Необязательное число, задающее количество часов, по // прошествии которых cookie должен закончить свое действие. // path: Необязательная строка, задающая атрибут path для cookie. // domain: Необязательная строка, задающая атрибут domain для cookie. // secure: Необязательное логическое значение, которое, будучи равно // true, требует защиты при передаче cookie. // function Cookie(document, name, hours, path, domain, secure) { // Все предопределенные свойства этого объекта начинаются с символа '$', чтобы // отличить их от других свойств, являющихся значениями, предназначенными // для хранения в cookie. this.$document = document;this.$name = name; if (hours) this.$expiration = new Date((new Date()).getTime() + hours*3600000); else this.$expiration = null; if (path) this.$path = path; else this.$path = null; if (domain) this.$domain = domain; else this.$domain = null; if (secure) this.$secure = true; else this.$secure = false; } // Эта функция является методом store() объекта Cookie. Cookie.prototype.store = function () { // Сначала выполняем цикл по свойствам объекта Сookie и собираем // значение cookie. Так как cookie используют знаки равенства и // точки с запятой в качестве разделителей, для индивидуальных // переменных состояния, хранящихся в одном значении cookie, мы // будем использовать двоеточния и амперсанды. Обратите внимание, // что мы кодируем каждую переменную состояния с помощью функции // escape() на тот случай, если она содержит знаки пунктуации или // другие недопустимые символы. var cookieval = ""; for(var prop in this) { // Игнорирует свойства с именами, начинающимися с '$', а также методы if ((prop.charAt(0) == '$') || ((typeof this[prop]) == 'function')) continue; if (cookieval != "") cookieval += '&'; cookieval += prop + ':' + escape(this[prop]); } // Теперь, когда у нас есть значение cookie, собираем вместе // полную строку cookie, включающую имя и различные атрибуты, указанные // при создании объекта Cookie. var cookie = this.$name + '=' + cookieval; if (this.$expiration) cookie += '; expires=' + this.$expiration.toGMTString(); if (this.$path) cookie += '; path=' + this.$path; if (this.$domain) cookie += '; domain=' + this.$domain; if (this.$secure) cookie += '; secure'; // Теперь сохраняем cookie, устанавливая «магическое» свойство // Document.cookie. this.$document.cookie = cookie; } // Эта функция является методом load() объекта Cookie Cookie.prototype.load = function() { // Сначала получаем список всех cookie, относящихся к этому документу. // Мы делаем это путем чтения «магического» свойства Document.cookie. var allcookies = this.$document.cookie; if (allcookies == "") return false; // Теперь извлекаем из этого списка только cookie с указанным именем.var start = allcookies.indexOf(this.$name + '='); if (start == -1) return false; // Для этой страницы cookie не определены start += this.$name.length + 1; // Пропускаем имя и знак равенства var end = allcookies.indexOf(';', start); if (end == -1) end = allcookies.length; var cookieval = allcookies.substring(start, end); // После извлечения значения указанного cookie мы должны разбить // это значение на несколько отдельных переменных состояния. // Пары имя/значение отделяются друг от друга амперсандами, а // отдельные имена отделяются от значений двоеточиями. Для всех // этих операций мы используем метод split(). var a = cookieval.split('&'); // Разбиваем на элементы массива пар “имя/значение” for(var i=0; i < a.length; i++) // Разбиваем каждую пару на два элемента массива a[i] = a[i].split(':'); // После разбора значения cookie устанавливаем все имена и значения // переменных состояния в объекте в данном объекте Cookie. Обратите // внимание на использование функции unescape() для значения свойства; // она нужна потому, что при сохранении значений мы вызывали escape(). for(var i = 0; i < a.length; i++) { this[a[i][0]] = unescape(a[i]); } // Все готово, поэтому возвращаем код успешного завершения return true; } // Эта функция является методом remove() объекта Cookie Cookie.prototype.remove = function() { var cookie; cookie = this.$name + '='; if (this.$path) cookie += '; path=' + this.$path; if (this.$domain) cookie += '; domain=' + this.$domain; cookie += '; expires=Fri, 02-Jan-1970 00:00:00 GMT'; this.$document.cookie = cookie; } //=================================================================== // Приведенный выше код является определением класса Cookie. // Следующий код – это пример применения этого класса. //=================================================================== // Создаем cookie, который мы будем использовать для сохранения // состояния этой веб-страницы. Так как мы используем путь по умолчанию, // этот cookie будет использоваться для всех веб-страниц, расположенных в // том же каталоге или “ниже” его. Следовательно, cookie должен иметь // имя, уникальное среди всех этих страниц. Обратите внимание, что мы // устанавливаем дату окончания действия через десять дней после текущего// момента. var visitordata = new Cookie(document, "name_color_count_state", 240); // Сначала пытаемся прочитать данные, хранящиеся в cookie. Если cookie // не определен или не содержит нужных нам данных, запрашиваем данные // у пользователя. if (!visitordata.load() || !visitordata.name || !visitordata.color) { visitordata.name = prompt("Ваше имя:", ""); visitordata.color = prompt("Ваш любимый цвет:", ""); } // Отслеживаем, сколько раз пользователь посещал страницу: if (visitordata.visits == null) visitordata.visits = 0; visitordata.visits++; // Сохраняем значения cookie, даже если они уже сохранялись, чтобы // была установлена дата окончания действия, на 10 дней более поздняя, чем // последний визит. Кроме того, снова сохраняем cookie, чтобы была // сохранена обновленная переменная состояния visits. visitordata.store(); // Теперь мы можем использовать прочитанные нами переменные состояния: document.write('<font size="7" color="' + visitordata.color + '">' + Добро пожаловать, ' + visitordata.name + '!' + '</font>' + '<p>Вы посещали страницу ' + visitordata.visits + ' раз.'); </script> <form> <input type="button" value="Забудьте мое имя" onclick="visitordata.remove();"> </form>