Кроссбраузерное печенье (cookie)

версия для печати

Есть как минимум два языка программирования, способных управлять cookie - PHP и Javascript. Есть множество браузеров, поддерживающих работу с печеньками. И есть проблема: удаление этих самых cookies может выполняться по-разному, в зависимости от языка/браузера. В этой статье я расскажу о своих изысканиях и кроссбраузерном подходе к манипуляциям с cookie.

Ликбез: cookie (куки, (англ) печенье) - маленький файл, создаваемый веб-сервером или браузером и хранимый на компе пользователя. Веб-клиент (обычно браузер) каждый раз передает этот файл(ы) веб-серверу в HTTP-запросе при обращении к странице, соответствующей печеньке. Cookie применяются для сохранения данных на стороне пользователя, например для сохранения персональных настроек на сайте. Также cookie применяется в механизме аутентификации на сайте, сессиях и ведении статистики пользователей. Некоторые браузеры соблюдают ограничение на размер 4 Кб для одного cookie (учитываются значение cookie-файла и его имя).

Создание печеньки на PHP особых сложностей не вызывает:

$value='set cookie from web-server'; 

//Доступ к печеньке - из текущей директории. Время жизни - до конца сессии.
setcookie('testCookie0', $value);

//Доступ тот же, время жизни - 1 час.
setcookie('testCookie1', $value, time()+3600);

//Доступ - из каталога "~UserX" и его подкаталогов, время жизни - 1 час.
//Кроме каталога уточнить домен доступа - "site.ru" включая поддомены (точка в начале) 
//Защищенная передача содержимого cookie (по HTTPS-протоколу) 
setcookie('testCookie2', $value, time()+3600, '/~UserX/', '.site.ru', 1);

На javascript несколько сложнее, но смысл тот же:

//Печенька на год, доступ в пределах сайта, передача не защищенная. 
//Особо деревянные браузеры* не знают max-age, для них собираем expires на год вперед.
var value='set cookie from browser'; 
var nextyear=new Date();
nextyear.setFullYear(nextyear.getFullYear() + 1);
document.cookie='testCookie3='+value+'; path=/; max-age='+(60*60*24*365) + '; expires=' + nextyear.toGMTString();
*Под особо деревянными следует понимать семейство Ослов (Internet Explorer) до 7-го включительно.

Изменение содержимого cookie выполняется тем же способом, что и ее создание. Т.е. опять создаем печеньку, полностью указывая те же параметры, но с другим значением в переменной value.

Удалить cookie можно разными способами. Самый очевидный - назначать нужное время жизни и ждать, когда печенька сама помрет. Вот только не все браузеры при этом корректно чистят свой кэш (а cookie хранятся именно там), в итоге комп пользователя забивается мусором. Другой способ: установить параметр "max-age=0". Это указание правильно поймут, например, Опера и Огнелис, но IE прогинорит требование удаления. Чтобы и ему было понятно, придется прибегнуть к параметру "expires". Он устанавливает дату, после которой cookiе считается просроченной и удаляется. Чтобы не париться с расчетом даты "в прошлом" на компе юзера, можно указать такое значение:

expires=Thu, 01-Jan-1970 00:00:01 GMT

Или просто "-1". Тоже должно работать.

Справедливости ради стоит уточнить два момента:

  • даже при программном удалении cookie, браузер все еще может сохранять ее в кэше;
  • согласно книге Дэвида Флэнагана, параметр "expires" считается устаревшим ("Javascript. Подробное руководство", 2008 г., с.475). Но ничто деревянное нам не чуждо :(, так что пользуем.

Итак, кроссбраузерый подход к удалению cookie можно реализовать так:

//Доступ - из каталога "site.ru/~UserX/", время жизни - 1 год.
var nextyear=new
Date();
nextyear.setFullYear(nextyear.getFullYear() + 1);
document.cookie='testCookie4=store this text; path=/~UserX/; domain=site.ru; expires=' + nextyear.toGMTString();
...
//Не будем ждать год, удалим cookie сейчас
document.cookie='testCookie4=store other text; path=/~UserX/; domain=site.ru; max-age=0; expires=-1';
Этот код, адаптированный под PHP, тоже будет работать.

Обратите внимание: при удалении печеньки в javascript таким способом ее значение можно указывать произвольное, в том числе пустое. На PHP существует еще одна возможность удаления: указание в значении печеньки пустой строки или FALSE. При этом остальные параметры должны быть те же. Возращаясь к самому первому примеру, следующий код на PHP удалит печеньку так же, как и установка параметра "expires":

<?php setcookie('testCookie1', '', time()+3600); ?> Это работает только в PHP, тот же JavaScript по таким параметрам создаст cookie с пустым значением и часом жизни.

Собственно все :). Работа с cookie этим не ограничивается, но целью статьи было рассказать о кроссбраузерном удалении, т.к. именно здесь у меня была проблема в свое время. Остальные возможности достаточно хорошо документированы и доступны в справочниках и книгах.

[1oo%, EoF]

Понравилась статья? Расскажите о ней друзьям:


Комментарии
Для работы модуля комментариев включите javaScript


Показать/скрыть правила
Имя
[i] [b] [u] [s] [url]
:-) ;-) :D *lol* 8-) :-* :-| :-( *cry* :o :-? *unsure* *oops* :-x *shocked* *zzz* :P *evil*

Осталось 1000 символов.
Код защиты от спама Обновить код
Каждый комментарий проходит ручную модерацию. 100% фильтрация спама.
Продвижение
Время
Метки