Использование cookie в LXP
В LXP предусмотрены средства для присваивания и чтения значений cookie. Присваивание осуществляется тегом <setcookie>, а для вывода используется тег <putcookie>.
Присваивание cookie
Значение cookie должно присваиваться перед отправкой каких-либо данных с сервера Apache. Дело в том, что значения cookie включаются в заголовки, предшествующие непосредственному содержимому запрашиваемого документа.
Для подобных случаев существует специальная конструкция – так называемый инициализатор, определяемый тегом <dock type="init">. Этот тег должен находиться сразу же после тега <lхр> в вашем документе, а внутри открываемого им блока могут находиться теги <setcookie>. Синтаксис открытия инициализатора:
<1хр> <dock type="init">
В открытом блоке значения cookie задаются командой следующего вида:
<setcook1e name="ww" уа1ие="значенле" domain="домен" path="путь" ехрires="срок_дейсвия" />
После закрытия блока инициализатора тегом </dock> значения cookie задаются, а данные, следующие за закрывающим тегом, передаются клиенту.
При записи cookie обязательны только атрибуты name и value. Присваивание пустого значения (атрибут value) приводит к удалению cookie.
Явное указание домена позволяет задать домен, в котором принимается значения cookie (например, www.thelinuxreview.com или thelinuxreview.com для всех субдоменов). Атрибут путь задает путь URI, по которому хранится значение cookie (например, path="/app/").
Если атрибут expires не задан, значение cookie действует на протяжении сеанса и автоматически становится недействительным при закрытии браузера. В противном случае величина атрибута либо определяет интервал в часах, в течение которого значение cookie остается действительным, либо количество секунд с 1970 года до момента истечения срока действия cookie. Если величина атрибута больше миллиона, предполагается вторая интерпретация.
В отличие от некоторых web-языков, документы LXP узнают обо всех значениях cookie в том же запросе, в котором они были заданы. Передача информации о cookie реализуется на уровне внутренней логики LXP, а включенные документы других типов (например, РНР) не будут знать о назначении cookie до поступления следующего запроса. Это связано с самой природой файлов cookie, хранимых на стороне клиента.
Примечание
Инициализатор также является удобным для выполнения любой общей инициализации в документе, поскольку ни комментарии, ни символы новой строки в инициализаторе не передаются браузеру. В инициализаторе допускается включение внешних файлов LXP.
Чтение cookie
В отличие от других web-языков (таких, как PHP), LXP не обеспечивает автоматической интерпретации значений cookie как переменных. Вместо этого LXP наряду со списком переменных ведет отдельный список cookie. Это сделано для предотвращения возможных конфликтов имен переменных и имен cookie. Пример вывода cookie тегом <putcookie> приведен в листинге 13.7.
Листинг 13.7. Вывод значения cookie.
<lхр> Your cookie "user" is set to: <putcookie name="user" /> </lxp>
При подстановке значения cookie в атрибут LXP возникает естественное желание воспользоваться тем же обозначением $, как при подстановке значений переменных, но это может привести к потенциальным конфликтам между значениями cookie и значениями переменных. По этой причине к значениям cookie всегда следует обращаться через специальный объект LXP cookies (листинг 13.8).
Листинг 13.8. Подстановка значения cookie.
<lхр> <setvar welcome_msg="Welcome. @cookies.user!" /> <if cookies.user> <putvar name="welcome_msg" /> </if> </lxp>
В LXP 0.8 для совместимости с предыдущими версиями действует следующее правило: если переменная с указанным при подстановке именем (например, $my_cookie) не найдена, LXP ищет имя в списке cookie. Тем не менее в будущих версиях LXP это правило будет либо отменено, либо отдельно настраиваться.