HTTP. Часть 11. Cookie-наборы: сохраненное состояние

Общая информация о cookie

Как вы уже, вероятно, знаете, HTTP является протоколом без сохранения состояния (stateless protocol). Это значит, что нет информации, или состояния, которое оставалось бы у браузера между различными транзакциями HTTP, cookie-наборы — это механизм, позволяющий Web-приложениям сохранять информацию состояния в браузере.

Cookie-набор представляет собой маленькую переменную, сохраняемую в браузере, которую может устанавливать серверное приложение, cookie-наборы позволяют сохранять пользовательские предпочтения, регистрационную информацию, сеансовые переменные и так далее. Лучше всего думать о них как о парах «имя-значение».


Интересно, что cookie-наборы не являются частью официальной спецификации HTTP; они были разработаны компанией Netscape и затем быстро приняты всей Internet-индустрией, cookie-наборы стали настолько стандартными, что часто браузер, не оснащенный этим механизмом, вообще не может получить доступ к некоторым Web-сайтам.

Действия для установки cookie

Когда программа, выполняемая на Web-сервере, намеревается установить cookie-набор, происходит примерно следующая последовательность событий:

  1. Сервер посылает клиенту заголовок Set-cookie, содержащий данные, которые он хочет сохранить вместе с именем cookie-набора.
  2. Клиент, принимающий cookie-набор, сохраняет эту информацию вместе с URL или доменом, от которого получен cookie-набор.
  3. При последующих запросах этого URL или домена клиент автоматически отправляет информацию этого cookie-набора обратно на сервер.

Cookie-набор может быть ограничен определенным URL или доменом, равно как может быть ограничен только текущим сеансом или определенным периодом времени.

Вот как выглядит HTTP-транзакция с cookie-набором на низком уровне:

  1. Пользователь заполняет форму регистрации, затем генерирует HTTP POST-транзакцию:
    POST /gavnokod.com/login.php НТТР/1.0

    Обычные заголовки передается между клиентом (пользователем) и сервером.
    В действительности передаваемые данные выглядят так:

    username=shelley&password=w00t34
  2. Сервер проверяет базу данных пользователей и подтверждает, что shelley -авторизованный пользователь. Затем он посылает обратно cookie-набор, содержащий идентификатор пользователя shelley, чтобы в следующий раз не искать его снова:
    НТТР/1.0 200 0К
    [Здесь опять идут нормальные заголовки]
    Set-Cookie: user_id=265;domain=gavnokod.com;Expires=Mon,20-Sep-2003 16:54:56 GMT;Path=/
    

Так устанавливается значение cookie-набора. Технически теперь он существует в контексте пользовательского браузера как маленький текстовый файл, содержащий значения для сайта. Теперь, если пользователь вернется на Web-сайт gavnokod.com, браузер автоматически вспомнит: «Ага, у меня есть cookie-набор для этого сайта. Я должен отправить его» и отправит эту информацию.

То есть, в следующий раз, когда браузер посетит этот сайт, клиент распознает, что необходим cookie-набор и отправит следующее:

GET /index.-php HTTP/1.0
[Здесь идут нормальные заголовки]
Cookie: user_id=265

Работа с cookie в PHP

PHP имеет замечательную встроенную поддержку программирования с использованием cookie-наборов.

Большая ее часть сосредоточена вокруг встроенной переменной $_СOOKIE и функции setcookie ().

Предположим, что вы пишете программу РНР, и хотите получить доступ к именованному идентификатору пользователя user_id.

Все, что вам необходимо — это код следующего вида:

<php
  $user id = $ COOKIE['user id'];
?>

Как видите, РНР автоматически обрабатывает всю «скрытую магию» HTTP для упрощения работы с cookie-наборами.

Установка cookie-набора ненамного сложнее:

<php
  setcookie('user_id' , 12);
?>

Просмотр cookies

Для просмотра cookies на текущем сайте можно использовать такой javascript код

<a target="_blank" href="javascript:alert('Cookies stored by this host or domain:\n\n' + document.cookie.replace(/; /g,'\n'));">View Cookies Info</a>

Важная информация

Важной вещью, которую следует понимать в отношении cookie-наборов, является то, что они реализованы в виде заголовков HTTP.

Заголовки HTTP должны предшествовать началу документа, пересылаемого по HTTP.

Это значит, что вы не можете начать вывод документа в РНР (например, оператором print) , а затем установить cookie-набор.
Это вызовет ошибку и не установит cookie-набор.

Когда вы структурируете PHP-код, следует об этом помнить.

Если вы не можете установить cookie-набор перед отправкой части документа, обратите внимание на средство буферизации(кешированияob_start , которое позволит вам устанавливать cookie-набор после вывода содержимого. Трюк заключается в том, что поскольку вывод буферизуется, cookie-набор попрежнему предшествует реальному выводу.

Заключительным замечанием относительно cookie-наборов является то, что они имеют тенденцию усложнять программирование. Довольно часто можно встретить сообщения в списках рассылки, имеющих отношение к cookie-наборам.

Удобная практика отладки заключается в том, чтобы иметь несколько Web-браузеров, инсталлированных на вашей машине, чтобы тестировать различные cookie-наборы в одно и то же время. Например, вы можете использовать Mozilla для тестирования пользовательской учетной записи shelly вместе с cookie-наборами, и Firebird — для тестирования пользовательской учетной записи scott вместе с cookie-наборами.

  • ppppp

    Выбирайте сайты на основе html css, а рнр коды использую как дополнения к сайту.
    В вордпресс и джумле, как ни крути, знать основы прграммирования html css обязательно….