Переменные Session
Все сервера веб приложений поддерживают сессии. Важно понять, что понятие "сессия" относится к одному определенному посетителю сайта. Сессия существует до тех пор, пока сервер продолжает получать HTTP запросы от данного клиента. Если в течении определенного времени от посетителя не было ни одного запроса, то сессия "сгорает" и все переменные этой сессии также становятся недоступны. Пока сессия "жива" можно создавать переменные типа session, которые будут доступны данному посетителю на других страницах этого сайта до тех пор, пока сессия не будет либо завершена вручную, либо автоматически удалена из-за отсутствия активности со стороны тоге же посетителя.
Чтобы переменные session были доступны, следует в файле Application.cfm указать тег <cfapplication> с такими параметрами:
Переменные session могут быть использованы для разных целей. Наиболее часто их используют совместно с процессом входа в систему, когда пользователю предлагается ввести свое имя и пароль, чтобы войти в систему. После того, как сессия такого пользователя по некоторым причинам будет завершена, то ему снова придется указывать свои имя и пароль, чтобы продолжить свою работу с программой. Переменные session не рекомендуется использовать в работе с Интернет магазинами, т.к. при формировании заказа клиента нужно хранить информацию о его заказе значительно дольше, чем "живет" сессия.
Переменные session, как и все остальные типы переменных ColdFusion, хранятся в одноименной структуре и, для отладки приложения, могут быть просмотрены с помощью тега <cfdump>.Поскольку переменные session всегда хранятся в памяти сервера, то во избежании их повреждения их всегда следует заключать внутри тега <cflock>. Обычно при создании аутентификации пользователя мы создаем некую переменную, например session.isLoggedIn, и на каждой странице приложения проверяем ее значение, чтобы узнать имеет ли право данный пользователь работать с данной страницей сайта. Код проверки этой переменной такой:
Блокировки тега <cflock> немного замедляют работу приложения, но это оправдано повышением безопасности целостности переменных, хранящихся в памяти сервера. Но что, если нам на странице нужно несколько раз проверять присутствие и значение переменной session.isLoggedIn? Для этого следует в файле Application.cfm создать временную переменную и работать только с ней, тем самым, мы используем тег <cflock> только один раз и снимаем нагрузку с ColdFusion сервера. Вот пример кода:
Переменные Client
Переменные client имеют несколько потрясающих преимуществ над переменными session/ Поскольку они не "живут" в памяти сервера, то и блокировать их тегом <cflock> не надо. По-умолчанию, переменные client хранятся в реестре, но поскольку реестр "не резиновый", то большинство разработчиков хранят их в базе данных. Это позволяет переложить заботу о сохранности переменных на базу данных. К тому же, базы данных достаточно быстры и при использовании кластеризации приложений не требуют дополнительного программирования.
Красота переменных client в том, что ими управляет сам ColdFusion сервер и для этого требуется всего лишь в теге <cfapplication> указать атрибут clientmanagement="Yes".Говоря о технической стороне управления переменными client, можно сказать, что при первом посещении CF приложения, на компьютере клиента в cookies сохраняются две переменные CFID и CFTOKEN. Их значения уникальны и при создании новой сессии их значения будут другими. Переменные client относятся к определенной сессии (той сессии, в которой были созданы), а, следовательно, привязаны к определенным значениям переменных CFID и CFTOKEN. Если сессия уже другая, то и значения CFID и CFTOKEN тоже сменились и переменные client становятся недоступными.
В реестре переменные client хранятся в виде пары значений имя/значение, а в базе данных они сериализуются в одну строку в виде ключ/значение и при необходимости десериализуются в удобный для использования вид. В базе данных они хранятся в двух таблицах: CDATA и CGLOBAL. Если ваше приложение не использует специальные переменные client.hitcount, client.lastvisit и client.timecreated, то для небольшого прироста производительности вы можете отключить опцию "Disable global client variable updates" в свойствах источника хранения переменных client в Административной оболочке ColdFusion сервера. Это свойство можно регулировать индивидуально для каждого источника хранения переменных client.У переменных client только один недостаток - в них можно хранить только простые типы данных. Вы не сможете хранить в них структуру, запрос или массив, но на практике это не является существенным недостатком, т.к. такие комплексные данные можно предварительно сериализовать, а потом поместить в переменную client. Не совсем понятно, для чего вам понадобится так делать, но …
Еще одно ограничение переменных client, которое также легко можно обойти, это их зависимость от переменных CFID и CFTOKEN. Если ColdFusion сервер создаст новую сессию, то CFID и CFTOKEN получать новые значения и переменные client будут потеряны.Сериализация и портативные клиентские переменные
Что такое сериализация? Это процесс преобразования набора переменных или комплекса данных в одну строку. В ColdFusion есть поддержка WDDX (технология, основанная на базе синтаксиса XML) и набора функций (как ColdFusion, так и JavaScript), необходимых для сериализации и десериализации данных. Мы же можем использовать ColdFusion теги для сериализации данных, чтобы хранить их и при необходимости использовать.
Чтобы продемонстрировать эту технику, давайте представим приложение, в котором пользователям дана возможность определять свои собственные настройки. Принцип работы приложения таков:Следующий код показывает, как можно перевести выбранные настройки в структуру, чтобы потом сериализовать ее с помощью тега <cfwddx>:
Затем, полученную строку мы сохраняем в базе данных. Естественно, в базе данных такого приложения должно быть как минимум две таблицы: первая -информация о пользователе (логин, пароль), вторая - :настройки пользователя. Причем вторая таблица связана внешним ключом с первой таблицей. Для понимания этого момента, вам необходимо знать основы создания баз данных. Итак, код для сохранения настроек может выглядеть так:
Обратите внимание, что настройки сохраняются с помощью SQL-инструкции Update, а не Insert, т.к. настройки уже есть в таблице. Они были добавлены по-умолчанию при создании учетной записи.
В момент открытия учетной записи, мы по внешнему ключу получаем настройки пользователя в сериализованном виде и десериализуем их в переменные client:На всех страницах сайта мы используем переменные client, чтобы отображать его так, как нужно пользователю. А если пользователь не имеет своей учетной записи или еще не открыл ее? Тогда следует используются переменные client, определяемые по-умолчанию в файле Application.cfm:
Это примерные настройки. На вашем сайте они могут быть совсем другими.
Как вы заметили, процесс сериализации и десериализации производился с помощью тега <cfwddx>. Направление действия указывалось в атрибуте action. Здесь приведен простой пример использования тега <cfwddx>, а более подробно о нем вы можете узнать из справочника по CFML.Описанный выше пример обращения с переменными client показывает, как можно хранить настойки пользователя, не полагаясь на поддержку cookies, которые поддерживаются не на всех компьютерах пользователей. Тем самым, используя переменные client, мы не зависим от конфигурации компьютера пользователя.
Нет сомнений, что переменные client и session очень интересны, полезны и, что самое главное, легко применимы в ваших приложениях.
© 2002-2005 г. Вадим Пушкарев