h1> Хранение пользовательской информации
(Продолжительность занятия 40 минут)
Активные страницы позволяют Web-приложению хранить состояние, то есть информацию, связанную с конкретным пользователем. Web-приложение поддерживает:
- состояние приложения — эти данные доступны всем пользователям Web-приложения.
- состояние сеанса — эти сведения доступны только пользователю данного сеанса.
Состояния на пользовательских компьютерах поддерживаются с помощью агентов (cookies), которым и посвящено это занятие.
Изучив материал этого занятия, Вы сможете:
- создавать агенты и пользоваться ими;
- сохранять информацию о сеансе с помощью объекта Session;
- сохранять сведения о приложении средствами объекта Application;
- создавать сценарии обработки событий в активной странице Global.asa.
Применение агентов
Агенты (cookies) — это механизм, позволяющий сохранять рабочее состояние в файле (обычно он называется cookies) на компьютере пользователя.
Примечание Хотя основные
программы просмотра Web поддерживают применение агентов, есть две проблемы.
- Агенты не являются стандартным средством HTTP или других спецификаций, поэтому их не всегда поддерживают все существующие программы просмотра.
- Так как агенты позволяют Web-серверу создавать и редактировать файл на компьютере пользователя (что создает потенциальную угрозу безопасности), то и Netscape Navigator, и Microsoft Internet Explorer позволяют пользователям отключать эту функцию.
Агент похож на жетон для конкретной страницы, который Web-сервер посылает пользователю. Тот возвращает агента серверу при каждом последующем обращении к данной странице (или набору страниц).
Агенты позволяют Web-приложению связывать информацию с пользователем. Вы можете устанавливать и получать значения агентов через набор Cookies.
Когда Web-сервер возвращает пользователю HTTP-ответ, последний может содержать агент со списком ресурсов, для которых он действителен.
Агент передается пользователю посредством заголовка Set-Cookie в НТТР-, ответе. Все последующие HTTP-запросы пользователя, попадающие в диапазон действия агента, сопровождаются текущим значением агента.
Создание агентов
Значения агентов, которых Ваш Web-сервер отправляет пользователю, задаются с помощью набора Cookies объекта Response. Если агент не существует, метод Response.Cookies создаст его на компьютере пользователя.
Пример Здесь создается
агент со значением city=Redmond:
<% Response.Cookies("city")="Redmond" %>
Если Вы хотите, чтобы агент относился ко всем страницам Вашего Web-приложения, присвойте атрибуту Path агента значение «/». После этого любой запрос страницы Вашего Web-приложения будет сопровождаться отправкой агента.
Пример Вот агент, относящийся
ко всем страницам Web-приложения:
Response.Cookies("city").Path = "/"
Вы вправе устанавливать и другие атрибуты агента, например срок его действия.
Пример Здесь задается
срок окончания действия агента:
Response.Cookies("Type").Expires = "July 31, 1997"
Считывание агентов
Программа просмотра, запрашивая страницы Вашего Web-приложения, сопровождает запрос соответствующим агентом (если, конечно, он был создан). Чтобы считать значение агента, используйте набор Cookies объекта Request.
Пример Если HTTP-запрос
содержит агент со значением city=Redmond, в результате работы кода этого примера
будет получено значение Redmond:
<%= Request.Cookies("city") %>
Объект Session
Объект Session содержит информацию о конкретном сеансе работы. Переменные, сохраненные в объекте Session, не уничтожаются, когда пользователь перемещается по страницам Web-приложения — напротив, они существуют на протяжении всего сеанса. Объект Session отличается от агента тем, что его поддерживает сервер, а не компьютер пользователя.
Web-сервер автоматически создает объект Session при подключении пользователя и уничтожает его по окончании сеанса.
Сеанс начинается, когда пользователь запрашивает файл активной серверной страницы из виртуального корня Вашего Web-приложения. В начале Web-приложение создает идентификатор SessionID и передает программе просмотра HTTP-ответ для создания соответствующего агента. Хотя агент SessionID передается программе просмотра, он хранится не на жестком диске компьютера пользователя, а в памяти.
Если пользователь отказался принять агент SessionID (см. примечание в разделе «Применение агентов»), объект Session для этого пользователя не поддерживается.
По умолчанию сеанс длится 20 минут. Вы можете изменить это значение, модифицировав следующий параметр реестра:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Se rvices\W3SVC\ASP\Pa rameters\SessionTimeout
Синтаксис объекта Session
Объект Session имеет два свойства и один метод.
Свойство SessionID идентифицирует сеанс пользователя, а свойство Timeout задает значение тайм-аута сеанса.
Метод Abandon уничтожает объект Session и освобождает его ресурсы.
Синтаксис Для установки свойств и применения метода объекта Session используется следующий синтаксис:
Session.свойство\метод
Пример Этот код создает
и сохраняет псевдоним пользователя и данные о его месте жительства:
<% Session("nickname") = "Ненси"
Session("hometown") = "Редмонд %>
Пример Здесь показано,
как воспользоваться информацией, сохраненной в объекте Session:
Привет, <%= SessionC'nickname") %>.<BR>
Как погода в <%= Session( "home-town") %>?<BR>
Чтение данных из формы
В этом упражнении Вы создадите активную страницу, которая считывает данные, предоставленные ей HTML-формой, и сохраняет их в объекте Session.
Вы сохраните данные в объекте Session, чтобы их могли использовать другие страницы придуманного нами Web-узла State University.
> Добавление файлов в проект Visual InterDev
- Запустите Visual InterDev.
- В меню File выберите пункт New.
- На вкладке Projects выберите мастер Web Project Wizard.
- Назовите проект StateU и выберите для него папку WA\Practice\Ch10\StateU. Нажмите ОК.
- Сохраните имя сервера по умолчанию (localhost) и нажмите Next.
- Ознакомьтесь с предлагаемыми по умолчанию значениями и нажмите Finish.
- В меню Project выберите пункт Add To Project и выберите Files.
- В папке WA\Practice\ChlO выберите файлы home.asp, profile.asp и transcript.asp. Нажмите ОК.
> Чтение данных из формы
- Дважды щелкните файл profile.asp, чтобы открыть страницу в редакторе Visual InterDev Source Editor.
- Измените атрибут
ACTION тэга <FORM> так, чтобы он запускал файл profile.asp.
Чтобы изменить этот атрибут, найдите строку кода
<FORM NAME=frmProfile ACTION= METHOD=Post>
и замените ее следующей:
<FORM NAME=frmProfile ACTION=profile.asp METHOD=Post>
- Перед тэгом
<FORM> добавьте серверный сценарий, приведенный ниже:
<% If Not (IsEmpty(Request("txtID"))) Then
'Запрос поступил от кнопки Submit формы
username = Request("txtName")
id = Request("txtID")
major = Request("Major")
'Установка переменных сеанса
Session("username") = username
Session("id") = id
Session("major") = major
%>
Добро пожаловать, <%=username%>, в наш университет.
<Р>Похоже, Вас интересует <%=major%>.
<% End If %> <Р>
- Сохраните изменения в файле profile.asp.
> Тестирование кода profile.asp
- Правой кнопкой мыши щелкните файл profile.asp и выберите пункт Preview In Browser.
- Введите Ваш идентификатор и имя и выберите область интересов. Нажмите кнопку Submit.
- Что произошло после нажатия кнопки Submit?
> Использование данных сеанса в других файлах
- Дважды щелкните profile.asp для возврата в окно кода Visual InterDev.
- Найдите в файле profile.asp
следующую строку кода
<FORM NAME=frmProfile ACTION=profile.asp METHOD=Post>
и замените ее на приведенную ниже (она вызывает новую активную страницу):
<FORM NAME=frmProfile ACTION=transcript.asp METHOD=Post>
- Сохраните файл profile.asp.
- Дважды щелкните файл transcript.asp, чтобы открыть его окне кода Visual InterDev.
- Найдите следующую строку
кода:
For Student ID </font> </td>
Измените ее так:
For Student ID <%=Session("id")%> </font>
- Сохраните изменения в файле transcript.asp.
- Щелкните правой кнопкой файл profile.asp и выберите Preview In Browser.
- На панели инструментов нажмите Refresh View.
- Введите идентификатор
и свое имя, выберите область интересов и нажмите кнопку Submit.
На Web-странице должен появиться текст "For Student ID «номер »".
Объект Application
Объект Application обеспечивает доступ к информации всем пользователям Web-приложения.
Web-приложение запускается, когда пользователь, обратившийся к нему первым, запрашивает .asp-файл из виртуального корневого каталога Вашего Web-приложения. Программа заканчивает свою работу при отключении Web-сервера.
Вы можете создавать и хранить значения в объекте Application точно так же, как в объекте Session. Различие в том, что информация из объекта Application доступна все время, начиная с момента, когда первый пользователь обращается к активной странице, и заканчивая отключением Web-сервера.
Например, если Вы хотите сообщить что-то всем, работающим с Вашим Web-приложением, Вы можете создать административную страницу, где администратор введет информацию, адресованную всем пользователям. С этой страницы данные попадут в объект Application, после чего ее можно использовать во всех активных страницах. В результате все пользователи получат одну и ту же административную информацию из одного и того же источника.
Синтаксис Для методов объекта Application применяется следующий синтаксис:
Application.метод
Пример Здесь показано,
как добавить информацию, полученную с административной страницы, в Web-приложение:
<% Application( "ТемаЛекции") = Request. Form( "лекция")
Application("аудитория") = Request.Fоrm("аудитория")
Пример Здесь демонстрируется, как воспользоваться информацией из предыдущего примера:
Не пропустите сегодняшнюю лекцию в аудитории <%= Application( "аудитория") %>,
на тему <%= Аррliсаtiоп("ТемаЛекции") %>
Блокировка и разблокировка объекта Application
Все пользователи обращаются к одному и тому же объекту Application, поэтому вполне возможно, что два человека одновременно попытаются модифицировать его. Методы Lock и Unlock объекта Application помогают предотвратить подобную ситуацию. Объект Application нужно блокировать только в момент непосредственного внесения изменений.
После блокировки пользователи не смогут получить доступ к объекту Application при первой необходимости. Чтобы сгладить эти неудобства, постарайтесь минимизировать время действия метода Lock.
Пример Здесь демонстрируется,
как методами Lock и Unlock изменить значения счетчика посещений, используемого
в Web-приложении:
<%
Application.Lock
Application("NumVisits") = Application("NumVisits") + 1
Application.Unlock
%>
Этот узел посетили
<%= ApplicationC'NumVisits") %> человек.
Обработка событий в файле Global. asa
Global.asa — это первый файл, который обрабатывает Web-сервер, когда получает первый после запуска пользовательский запрос .asp-файла или когда .asp-файл запрашивает пользователь, о котором нет информации.
В состав Web-приложения может входить только один файл Global.asa. Он хранится в виртуальном корневом каталоге приложения. В файле Global.asa указывается следующая информация:
- события стадии запуска и/или завершения приложения;
- события стадии начала и/или завершения сеанса;
- тэги <OBJECT>, создающие компоненты при работе приложения или во время сеанса.
Если Вы сконструировали Web-приложение с помощью мастера, Microsoft Visual InterDev создает файл Global, asa с шаблонами процедур событии и комментариями по использованию этого файла.
События объекта Application
Объект Application имеет два события — Application_OnStart и Application_OnEnd. В
файле Global.asa их можно снабдить сценариями.
Любой сценарий, связанный с событием Application_OnStart, реализуется при запуске приложения. Аналогично, сценарии события Application_OnEnd выполняются при завершении приложения.
Пример Здесь демонстрируется
код для события Application_OnStart в файл Global.asa:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
'Код Вашего сценария
End Sub
</SCRIPT>
События объекта Session
Подобно объекту Application, объект Session снабжен событиями Session_OnStartH Session_OnEnd. Сценарии события Session_OnStart запускаются, когда пользователь, еще не открывший сеанс, запрашивает у Вашего приложения ASP-файл. Все сценарии события Session_OnEnd выполняются по окончании сеанса.
Пример Здесь событие
Session_OnStart используется для принудительной переадресации пользователя
на страницу регистрации на Вашем узле независимо оттого, какую именно активную
серверную страницу он запросил у Вашего Web-приложения:
' При открытии сеанса отправить пользователя на страницу регистрации
Sub Session_OnStart
If SessionC'username") = "" Then
' Сохранить название страницы, которую хотел посетить пользователь
Session("startpage") =
Request.ServerVariables("SCRIPT_NAME")
' Отправить пользователя на страницу регистрации
Response.Redirect "profile.htm"
End If
End Sub
Использование тэга <OBJECT> в файле Global.asa
Средствами тэга <OBJECT> в файле Global.asa можно создать компонент, работающий на Web-сервере.
Чтобы использовать тэг <OBJECT> в файле Global.asa, присвойте атрибуту RUNAT значение Server, а атрибуту SCOPE — значение Application или Session.
Чтобы задать компонент, укажите его зарегистрированное имя (PROGID) или идентификатор класса (CLASSID).
Пример Здесь с помощью
PROGID на время сеанса создается экземпляр компонента Advertisement Rotator:
<OBJECT RUNAT=Server SCOPE=Session ID=MyAd PROGID="MSWC.Adrotator">
</OBJECT>
Пример Здесь с помощью
CLASSID на время работы приложения создается экземпляр компонента Advertisement
Rotator:
<OBJECT RUNAT=Server SCOPE=Application ID=MyAd
CLASSID="Clsid:00000293-0000-0010-8000-OOAA006D2EA4"></OBJECT>
Когда Вы применяете тэг <OBJECT> для создания экземпляра компонента на время сеанса или на период работы приложения, переменная, связанная с компонентом, располагается в области имен сеанса или приложения соответственно. Для доступа к экземплярам компонентов Вам не придется пользоваться объектами Session или Application.
Пример Вот как открыть
экземпляр компонента Advertisement Rotator, объявленный в коде предыдущего
примера:
<%= MyAd.GetAdvertisement("addata.txt") %>
Резюме
Активные страницы позволяют хранить в Web-приложениях состояние — информацию, связанную с конкретным посетителем узла, — с помощью агентов и объектов Session и Application. Агенты хранят информацию на компьютере пользователя, а программа просмотра посылает агент серверу при каждом следующем посещении этой страницы (или группы страниц).
Объект Session отличается от агента тем, что хранит информацию о состоянии на сервере. В объекте Session указана информация для конкретного пользователя (или о нем). Web-сервер автоматически создает объект Session в начале сеанса и уничтожает его по завершении сеанса. Объект Session имеет два события:
Session_OnStart и Session_OnEnd.
Как и объект Session, объект Application предназначен для хранения информации. Разница между ними в том, что информация объекта Application доступна все время, начиная с момента первого запроса активной страницы и заканчивая отключением Web-сервера. У объекта Application есть два события: Application_OnStart и Application_OnEnd. В файле Global. asa их можно снабдить сценариями.