Серия лекций ASP (19) Управление сеансами
Автор:Eve Cole
Время обновления:2009-05-30 19:58:38
Одной из проблем успешной разработки веб-приложений является сохранение информации о пользователе, когда он переходит со страницы на страницу приложения во время посещения пользователя или сеанса. HTTP — это протокол без сохранения состояния, что означает, что веб-сервер рассматривает каждый доступ к странице как несвязанный доступ; сервер не сохраняет никакой информации о предыдущем доступе, даже если доступ происходит в течение нескольких дней после текущего доступа. назад. Отсутствие памяти о предыдущих посещениях затрудняет написание таких приложений, как онлайн-каталоги, которым может потребоваться отслеживать элементы каталога, выбранные пользователем при переходе между различными страницами каталога.
ASP предоставляет уникальное решение для управления проблемами информации о сеансе. Используя объект сеанса ASP и специальный идентификатор пользователя, сгенерированный вашим сервером, вы можете создать интеллектуальное приложение, которое сможет идентифицировать каждого входящего пользователя и собирать информацию, используемую приложением, для отслеживания предпочтений пользователя или выбора контента.
ASP устанавливает идентификатор пользователя через файлы cookie HTTP. HTTP-куки — это небольшие файлы, хранящиеся в браузере пользователя. Поэтому, если вы создаете приложение для браузера, который не поддерживает файлы cookie, или если ваши клиенты настроили свои браузеры на отказ от приема файлов cookie, не используйте функции управления сеансами ASP.
Вы также можете писать сценарии, которые запускаются при запуске или завершении приложения.
Начало и завершение сеансов Сеансы можно запустить тремя способами:
Новый пользователь запрашивает доступ к URL-адресу, который идентифицирует файл .asp в приложении, файл Global.asa которого содержит процедуру Session_OnStart.
Пользователь сохраняет значение в объекте Session.
Пользователь запрашивает файл .asp приложения, а файл приложения Global.asa использует тег <OBJECT> для создания экземпляра объекта с областью действия сеанса.
Если пользователь не запрашивает и не обновляет какую-либо страницу в приложении в течение определенного периода времени, сеанс автоматически завершится. Значение по умолчанию для этого периода составляет 20 минут. Вы можете изменить настройку ограничения времени ожидания приложения по умолчанию, установив свойство «Тайм-аут сеанса» на странице свойств «Параметры приложения» в диспетчере служб Интернета. Это значение должно быть установлено в зависимости от требований вашего веб-приложения и объема памяти сервера. Например, если вы хотите, чтобы пользователи, просматривающие ваше веб-приложение, оставались на каждой странице всего несколько минут, вам следует сократить значение времени ожидания сеанса по умолчанию. Слишком большое значение таймаута сеанса приведет к тому, что слишком много открытых сеансов будут исчерпать ресурсы памяти вашего сервера.
Если для определенного сеанса вы хотите установить значение тайм-аута, меньшее значения тайм-аута по умолчанию, вы можете установить свойство Timeout объекта Session. Например, следующий скрипт устанавливает значение тайм-аута равным 5 минутам.
<%Session.Timeout = 5%>
Вы также можете установить значение таймаута, превышающее значение по умолчанию. Свойство Session.Timeout определяет значение таймаута.
Вы также можете явно завершить сеанс с помощью метода Abandon объекта Session. Например, чтобы разместить кнопку «Выход» в таблице, задайте для параметра кнопки ACTION URL-адрес файла .asp, который содержит следующую команду.
<% Сеанс.Отказаться %>
О SessionID и файлах cookie
Когда пользователь впервые запрашивает файл .asp в данном приложении, ASP генерирует SessionID. SessionID — это число, сгенерированное сложным алгоритмом, который уникально идентифицирует каждый сеанс пользователя. В начале нового сеанса сервер сохраняет идентификатор сеанса в виде файла cookie в веб-браузере пользователя.
SessionID во многом похож на ключ, поскольку ASP может хранить информацию о пользователе в «безопасном» месте на сервере, когда пользователь взаимодействует с приложением во время сеанса. Точно так же, как ключ можно использовать для доступа к элементам в сейфе, доступ к содержимому «сейфа» можно получить через файл cookie SessionID пользователя, отправленный в заголовке HTTP-запроса. Всякий раз, когда ASP получает запрос страницы, он проверяет заголовок HTTP-запроса, чтобы получить файл cookie SessionID.
После того как файл cookie SessionID сохраняется в браузере пользователя, ASP по-прежнему повторно использует этот файл cookie для отслеживания сеанса, даже если пользователь запрашивает другой файл .asp или запрашивает файл .asp, работающий в другом приложении. Аналогичным образом, если пользователь намеренно прекращает сеанс или пропускает время ожидания сеанса, а затем запрашивает другой файл .asp, ASP начнет новый сеанс с тем же файлом cookie. Только когда администратор сервера перезапустит сервер или пользователь перезапустит веб-браузер, настройки SessionID, хранящиеся в памяти, будут очищены, и пользователь получит новый файл cookie SessionID.
Повторно используя файл cookie SessionID, ASP минимизирует количество файлов cookie, отправляемых в браузер пользователя. Альтернативно, если вы решите, что ваше приложение ASP не требует управления сеансами, вы можете запретить ASP отслеживать сеансы и отправлять идентификаторы сеансов пользователям.
ASP не отправляет файлы cookie сеанса при следующих обстоятельствах:
Состояние сеанса приложения отключено.
Страница ASP определяется как бессеансовая, то есть страница содержит тег <%@ EnableSessionState=False %>.
Обратите внимание, что файл cookie SessionID не обеспечивает постоянного метода отслеживания пользователя при многократном посещении веб-сайта. Информация SessionID, хранящаяся в памяти сервера, может быть легко потеряна. Если вы хотите отслеживать пользователей, которые посещают ваше веб-приложение с течением времени, вы должны создать идентификатор пользователя, сохранив специальный файл cookie в веб-браузере пользователя и сохранив информацию о файлах cookie в базе данных.
Хранить данные в объекте сеанса
Объект Session предоставляет динамический ассоциативный массив, в котором может храниться информация. Вы можете хранить числовые переменные и переменные объекта в объектах сеанса.
Переменные можно хранить в объекте Session, присваивая значения именованным элементам в объекте Session. Например, следующая команда сохраняет две новые переменные в объекте Session:
<%
Session("Имя") = "Джефф"
Session("Фамилия") = "Смит"
%>
Информацию можно получить из объекта Session, обратившись к этому именованному элементу. Например, отобразите текущее значение Session("FirstName"):
Добро пожаловать <%= Session("Имя") %>
Вы можете сохранить настройки пользователя в объекте Session, а затем получить доступ к настройкам, чтобы решить, какую страницу отправить пользователю. Например, вы можете разрешить пользователям указывать только текстовую версию контента на первой странице вашего приложения и применять этот выбор ко всем последующим страницам приложения, которые посещает пользователь.
<% If Session("ScreenResolution") = "Низкий" Тогда %>
Это текстовая версия страницы.
<%Еще%>
Это мультимедийная версия страницы.
<% Конец Если %>
Вы также можете сохранить экземпляр объекта в объекте Session, но это повлияет на производительность сервера.
Управление сеансами веб-фермы
Информация о сеансе ASP хранится на веб-сервере. Браузер должен запросить страницу у веб-сервера, чтобы получить сценарий, используемый для доступа к информации о сеансе. В веб-ферме (где многие веб-серверы несут ответственность за ответ на запросы пользователей) пользовательские запросы не всегда направляются на один и тот же сервер, а скорее на URL-адрес с помощью специального программного обеспечения, называемого процессом «балансировки нагрузки». назначается любому бесплатному серверу. Процесс балансировки нагрузки затрудняет сохранение информации о сеансе в веб-ферме.
Чтобы использовать управление сеансами ASP на сайте с балансировкой нагрузки, необходимо убедиться, что все запросы пользовательского сеанса направляются на один и тот же веб-сервер. Один из подходов — написать процедуру Session_OnStart, которая использует объект Response для перенаправления браузера на веб-сервер, на котором выполняется сеанс пользователя. Если все ссылки на страницах вашего приложения являются относительными, то все будущие запросы к странице будут направляться на один и тот же сервер.
Например, пользователь хочет получить доступ к приложению, запросив универсальный URL-адрес сайта: http://www.microsoft.com. Процесс балансировки нагрузки направляет запросы на сервер server3.microsoft.com. ASP создал новый сеанс пользователя на этом сервере. Во время процесса Session_OnStart браузер перенаправляется на указанный сервер:
<% Response.Redirect("http://server3.microsoft.com/webapps/firstpage.asp") %>
Браузер запросит указанную страницу, и все будущие запросы будут перенаправлены на тот же сервер.
Используйте файлы cookie
Файл cookie — это токен, который веб-сервер встраивает в веб-браузер пользователя для представления пользователя. В следующий раз, когда тот же браузер запросит страницу, он отправит файл cookie, полученный от веб-сервера. Файл cookie позволяет связать с пользователем набор информации. Сценарии ASP используют коллекцию Cookies объектов Response и Request для получения и установки значений cookie.
Установить файлы cookie
Чтобы установить значение файла cookie, используйте Response.Cookies. Если файл cookie не существует, Response.Cookies создаст новый файл cookie. Например, чтобы отправить имя файла cookie («планета») с соответствующим значением («Марс») в браузер, используйте следующие команды, которые должны появиться перед тегом <HTML> вашей веб-страницы:
<% Response.Cookies("planet")="Марс" %>
Если вы хотите, чтобы файл cookie использовался только во время текущего сеанса пользователя, просто отправьте файл cookie в браузер. Однако, если вы хотите распознать пользователя после того, как он закрыл или перезапустил браузер, вы должны заставить браузер сохранить файл cookie на жестком диске компьютера. Чтобы сохранить файл cookie, используйте свойство Expires объекта Response.Cookies и установите дату в будущем:
<%
Response.Cookies("планета") = "Марс"
Response.Cookies("planet").Expires = "1 января 1999 г."
%>
Файл cookie может иметь несколько значений; такой файл cookie называется индексированным файлом cookie. Каждому значению файла cookie присвоено ключевое слово; вы можете установить значение определенного ключевого слова файла cookie. Например:
<% Response.Cookies("planet")("Mars")="SpaceMissions" %>
Если существующий файл cookie имеет значение ключевого слова, но Response.Cookies не указывает имя ключевого слова, значение ключевого слова будет удалено. Аналогично, если существующий файл cookie не имеет значения ключевого слова, но Response.Cookies указывает имя и значение ключевого слова, существующее значение файла cookie будет удалено и будет создана новая пара ключ-значение.
Получить файлы cookie
Чтобы получить значение файла cookie, используйте коллекцию Request.Cookies. Например, если HTTP-запрос пользователя устанавливает планету = Марс, следующий оператор получит значение Марс:
<%= Request.Cookies("планета") %>
Аналогичным образом, чтобы получить значение ключевого слова из индексированного файла cookie, используйте имя ключевого слова. Например, если пользователь выполняет следующий HTTP-запрос:
планета=Марс&Марс=Космические миссии
Следующий скрипт вернет значение SpaceMissions:
<%= Request.Cookies("планета")("Марс") %>
Установка пути к файлу cookie Каждый файл cookie, сохраняемый ASP в веб-браузере пользователя, содержит информацию о пути. Когда браузер запрашивает файл, местоположение которого совпадает с путем, указанным в файле cookie, браузер автоматически пересылает файл cookie на сервер. По умолчанию путь к файлу cookie соответствует имени приложения, которое содержит файл .asp, первоначально создавший файл cookie. Например, если файл .asp в приложении с именем UserApplication создает файл cookie, то каждый раз, когда веб-браузер пользователя извлекает файл в этом приложении, этот файл cookie браузера также пересылается на сервер.
Чтобы объявить путь для файла cookie, отличный от пути приложения по умолчанию, используйте свойство Path коллекции ASP Response.Cookies. Например, следующий скрипт назначает путь SalesApp/Customer/Profiles/ файлу cookie с именем Purchases:
<%
Response.Cookies("Покупки") = "12"
Response.Cookies("Покупки").Expires = "1 января 2001 г."
Response.Cookies("Покупки").Path = "/SalesApp/Customer/Profiles/"
%>
Всякий раз, когда веб-браузер, содержащий файл cookie «Покупки», запрашивает файл, расположенный по пути /SalesApp/Customer/Profiles/ или его подкаталогах, браузер пересылает файл cookie на сервер.
Многие веб-браузеры, включая браузеры Microsoft Internet Explorer 4.0 и Netscape, сохраняют пути к файлам cookie. То есть, если регистр запрошенного файла отличается от зарезервированного пути к файлу cookie, браузер не будет пересылать файл cookie на сервер. Например, для ASP виртуальные каталоги /TRAVEL и /travel — это одно и то же приложение ASP, но для браузеров, сохраняющих регистр URL-адресов, /TRAVEL и /travel — это два разных приложения. Вы должны убедиться, что все URL-адреса файла .asp имеют одинаковый регистр, чтобы браузер пользователя мог пересылать сохраненные файлы cookie.
При желании вы можете использовать следующий оператор, чтобы установить путь к файлу cookie, чтобы файл cookie пересылался всякий раз, когда веб-браузер пользователя запрашивает файл с вашего сервера, независимо от приложения или пути:
Response.Cookies("Покупки").Path = "/"
Однако обратите внимание, что отправка файлов cookie на сервер без различия между приложениями может создать проблемы с безопасностью, если файлы cookie содержат конфиденциальную информацию, которая не должна быть доступна другим программам, кроме указанного приложения.
Сохранение состояния без использования файлов cookie Не все браузеры поддерживают файлы cookie. Даже при использовании браузера, поддерживающего файлы cookie, некоторые пользователи могут предпочесть отключить поддержку файлов cookie. Если вашему приложению необходимо реагировать на браузеры, которые не поддерживают файлы cookie, вам необходимо использовать управление сеансами ASP.
Если вы не используете управление сеансами ASP, вам необходимо написать собственный механизм для передачи информации между страницами вашего приложения. Существует два общих способа выполнения этой задачи:
Добавьте параметры в строку запроса URL-адреса. Например:
http://MyServer/MyApp/start.asp?name=Jeff
Однако некоторые браузеры отбрасывают явные параметры, передаваемые в строке запроса, когда форма отправляется с помощью метода GET.
Добавьте в таблицу скрытые значения. Например, следующая таблица HTML содержит неявный элемент управления. Этот элемент управления не отображается в фактической форме и не виден веб-браузеру пользователя. С помощью метода HTTP POST форма передает идентификатор пользователя в дополнение к информации, предоставленной пользователем.
<FORM METHOD="POST" ACTION="/scripts/inform.asp">
<INPUT TYPE="текст" NAME="город" VALUE="">
<INPUT TYPE="текст" NAME="country" VALUE="">
<INPUT TYPE="hidden" NAME="userid" VALUE= <%=UserIDNum(i) %>
<INPUT TYPE="отправить" VALUE="Ввести">
Этот метод требует, чтобы все цели ссылок, передающие информацию о пользователе, были закодированы в виде таблиц HTML.
Если вы в настоящее время не используете управление сеансами ASP, отключите поддержку сеансов для вашего приложения. Когда сеанс включен, ASP отправляет файл cookie SessionID каждому браузеру, который запрашивает страницу ASP. Чтобы отключить поддержку сеанса, снимите флажок «Включить состояние сеанса» на странице свойств «Параметры приложения» в диспетчере служб Интернета.
Бессеансовая страница ASP
ASP также предоставляет возможность создавать страницы без сеансов, которые можно использовать для отсрочки создания сеанса до тех пор, пока пользователь не получит доступ к странице ASP, требующей отслеживания сеанса.
Бессеансовые страницы не выполняют следующие функции:
Выполните процедуру Session_OnStart.
Отправить файл cookie идентификатора сеанса.
Создайте объект сеанса.
Доступ к встроенным объектам сеанса или объектам области сеанса, созданным с помощью тега <OBJECT>.
Выполняется последовательно с другими запросами сеанса.
Чтобы настроить .asp для работы без сеансов, используйте следующий оператор:
<%@ EnableSessionState=False %>
Этот сценарий следует поместить в первую строку файла .asp перед другими сценариями. По умолчанию, если этот флаг опущен, отслеживание сеансов включено.
Бессессионные страницы ASP повышают производительность ответа сервера, устраняя потенциально трудоемкие сеансовые операции. Например, рассмотрим следующую ситуацию: страница ASP содержит два фрейма HTML, фрейм 1 и фрейм 2, в наборе фреймов. Фрейм 1 содержит файл .asp, который выполняет сложный сценарий, а фрейм 2 содержит простой файл .html. Поскольку ASP выполняет запросы сеанса последовательно (то есть последовательно), вы не увидите содержимое кадра 2 до тех пор, пока не будет выполнен сценарий для кадра 1. Однако если для кадра 1 установлено значение «без сеанса», запрос ASP больше не будет обрабатываться последовательно, и браузеру не придется ждать завершения выполнения содержимого кадра 1, прежде чем он сможет обработать содержимое кадра 2.
Однако способ обработки нескольких запросов к различным кадрам в конечном итоге зависит от конфигурации веб-браузера пользователя. Некоторые веб-браузеры могут игнорировать бессессионную конфигурацию вашего файла .asp и по-прежнему обрабатывать запросы последовательно.