Метод Response. clea r стирает из выходного буфера всю информацию, кроме HTTP-заголовков ответа. Таким образом, если в вашей ASP-странице содержится статический HTML-код, и/или обработчик сценариев что-то вывел в выходной
поток HTML, можно вызвать метод Response. clear и начать заново с пустой
Web-страницы. Как и в случае метода Response. Flush, перед этим свойство
Response. Buffe r ДОЛЖНО быть установлено раВНЫМ True, Иначе ВЫЗОВ
Response. clea r вызовет ошибку времени выполнения.
Метод Response. clear можно использовать и после вывода промежуточных результатов, чтобы посетитель сайта увидел окончательный результат на страни — це, не содержащей сообщений о состоянии и промежуточных итогов. Например,
В Предыдуще м Пример е МОЖНО Заменит ь Два ПОСЛеДНИХ ВЫЗОВа Response. Writ e
Если нужно прекратить выполнение сценария и отправить браузеру всю накопленную выходную информацию, можно воспользоваться методом
Response. End. После вызова Response. End обработчик сценариев больше не об- рабатывает операторы сценария и не посылает оставшийся статический HTML-код, который может встретиться далее в тексте ASP-страницы. Метод
Response. End можно задействовать для прекращения выполнения сценария, если обнаружится, что невозможно выполнить какую-либо часть сложной процедуры. Например, предположим, что недоступна база данных второго офиса, и поэтому не — возможно вычислить общую сумму продаж. После проверки кода ошибки, который вернет оператор открытия базы данных, выполнение сценария можно прекратить, вставив в него следующий код:
rf errorOnConnect
Response. Write «Запрос не выполнен! Данные по офису 2 недоступны.»
Response. Write «»
Response. End \
End If
Обратите внимание, что сценарий выводит дескрипторы
и в
выходной поток HTML до вызова метода Response. End. Запомните, что вызов
Response. End прекращает дальнейшую обработку сценария. Более того, обработ — чик сценариев не будет копировать в выходной буфер оставшийся на ASP-стра —
нице статический HTML-код (наподобие дескрипторов и, сле —
дующих за сценарием).
Предотвращение вывода браузером устаревших
ASP-страниц
Возможно, вы заметили, что при первом заходе на какую-либо Web-страницу браузеру на ее получение и отображение требуется больше времени, чем при
последующих посещениях этой страницы. Причина этой заметной разницы в скорости загрузки часто состоит в кэшировании Web-страницы. При первом по- сещении Web-страницы ваш браузер должен получить страницу с сервера. Но после этого браузер может отобразить ту же самую страницу из кэша браузера,
который находится на (локальном) жестком диске. Например, на Windows-маши —
не Internet Explorer кэширует посещаемые вами Web-страницы — вместе с рисун — ками, звуком и другими мультимедийными файлами, используемыми на них —
На жесТКОМ ДИСКе В папке C:\Windows\Temporary Interne t Files. ЕСЛИ рабо —
тать только со статическими страницами, то кэширование и выборка Web-стра —
Глава 11. Активные серверные страницы (ASP) 56 9
ниц с локальногоч жесткого диска (или с жесткого диска proxy-сервера, если дос —
туп в Internet осуществляется через него) не вызывает проблем. Однако ASP — страницы динамичны по самой своей природе. К сожалению, с точки зрения браузера Web-страница, сгенерированная обработчиком сценариев, представляет
собой обычный статический Web-документ с расширением .asp. Поскольку. asp
в конце имени файла для браузера не означает ничего особого, он кэширует ASP-страницы и выбирает их из кэша. В результате Web-страница, отображаемая браузером при повторном посещении страницы, может не совпадать с тем, что вы увидели бы, если бы браузер получил страницу не из кэша, а от сервера.
Свойства Response. Expires И Response. ExpiresAbsolute ПОЗВОЛЯЮТ запре — тить браузеру отображать устаревшее содержимое, устанавливая для кэшируемых файлов дату и/или время окончания их годности. До истечения этого срока бра — узер не запрашивает Web-страницу с сервера, а отображает ее из кэша. Но после
истечения срока годности копии браузер при посещении этой страницы должен
выгрузить из Web-сервера ее «свежую» копию.
ПРАКТИКУМ
Пусть, например, существует ASP-страница, содержимое которой меняется раз в месяц/Если вы вносите изменения 1 января 2003 года, необходимо вставить в сце- нарий, генерирующий содержимое ASP-страницы, следующий оператор:
Установив в сценарии дату (и время) окончания годности страницы на тот момент, когда встроенные в страницу сценарии изменят ее содержимое, можно предотвратить получение посетителем устаревшей кэшированной информации.
СиНТаКСИС Оператора установки СВОЙСТВа Response. ExpiresAbsolut e ВЫГЛЯ — ДИТ так:
Response. ExpiresAbsolute = # конца> []#
Таким образом, в предыдущем примере срок действия всех кэшированных ко — пий ASP-страницы, измененных 01/01/2003, заканчивается в полночь 31/01/
2003 . (ЕСЛИ При установк е СВОЙСТВа Response. ExpiresAbsolut e ОПуСТИТЬ Время,
то оно считается полночью даты окончания срока годности.) Если нужно, чтобы
кэшированная страница была годна до 15:15 01/02/2003, потребуется написать
Установка конкретной даты и/или времени окончания годности требует руч —
ного редактирования сценария (для изменения срока годности) в начале каждого нового периода. Поэтому, видимо, более удобно задавать срок годности кэширо —
ванной страницы в виде количества минут, а не конкретной даты (и времени). Пусть, например, есть ASP-страница, показывающая курс акций, и ваш Web-сер — вер получает новые котировки каждые 15 минут. Чтобы кэшированное содержи —
мое было актуальным, Можно с помощью метода Response. Expires задать коли — чество минут до истечения срока годности страницы, используя следующий синтаксис:
Response. Expires =
57 0 Глава 11. Активные серверные страницы (ASP)
Таким образом, чтобы браузер запрашивал ASP-страницу с Web-сервера, если кэшированные данные загружены более 15 минут назад, нужно в сценарий, гене — рирующий содержимое ASP-страницы, добавить следующий оператор:
И, наконец, чтобы Web-браузеры не отображали устаревшие страницы, необ — ходимо еще помнить о тех proxy-серверах, которые не поддерживают дату (и вре- мя) конца срока годности. Если посетитель входит в Internet через proxy-сервер,
то proxy-сервер (как и Web-браузер) сохраняет в кэше на своем локальном жест — ком диске копии полученных Web-страниц. Когда браузер запрашивает страницу, уже находящуюся в кэше proxy-сервера, тот не выбирает заново эту страницу с сервера, а посылает браузеру страницу из кэша. Таким образом, после истечения срока годности страницы в кэше браузера он отправляет запрос Web-серверу на получение новой страницы. Но если proxy-сервер игнорирует срок годности кэ — шированной страницы, то он пошлет браузеру страницу с устаревшим содержи — мым из своего кэша.
Чтобы исключить получение устаревших ASP-страниц от proxy-сервера, следу —
ет установить СВОЙСТВО Response. CashControl равным «Private» . ЕСЛИ оставить
значение свойства Response. CashControl установленным по умолчанию, то есть
«Public», proxy-сервер сохранит страницу в папке кэша на своем жестком диске.
Но еСЛИ установить Значение СВОЙСТВа Response. CashControl раВНЫМ «Private»,
то он не будет так поступать. Значит, для обеспечения выборки Web-страницы с
Web-сервера при каждом обращении к ней нужно до или после оператора уста — новки даты и/или времени годности страницы вставить следующий оператор:
Перенаправление Web-браузера на другую страницу
Когда пользователи работают в Internet, они часто ставят закладки (т. е. добав — ляют их в список избранных сайтов) на страницы, к которым они хотят еще воз — вращаться. И хотя повторный вход по URL-адресу обычно не вызывает проблем, иногда нужно запретить посетителям входить напрямую в некоторые страницы
вашего сайта. Предположим, например, что вы хотите, чтобы перед просмотром содержимого сайта пользователь сначала ввел пароль или зарегистрировался. Если посетитель с помощью закладки входит сразу на страницу с информацией, минуя авторизацию, то потребуется найти способ автоматического перенаправле- ния этого посетителя на Web-страницу с формой авторизации или регистрации.
Метод Response. Redirect дает, возможность перенаправить посетителя сайта с запрошенной Web-страницы на другую.
ПРАКТИКУМ
Кроме перенаправления посетителя на другую страницу для того, чтобы он ввел пароль, этим приемом можно пользоваться и для распределения нагрузки между несколькими Web-серверами или если ваш сайт сменил адрес. Предположим, на —
пример, ЧТО у вас работают Два* сервера: NVBizNet. com И NVBizNet. com, И ВЫ ХО —
Глава 11. Активные серверные страницы (ASP) 57 1
тите равномерно распределить нагрузку между ними для увеличения общей про — изводительности. Поэтому вы переместили часть сайтов с сервера NVBizNet. com
на NVBizNet. com. Но посетители могли ранее установить закладки на домашние страницы сайтов на первоначальном сервере (NVBizNet. com). Для перенаправле- ния посетителей, которые пытаются на сервере NVBizNet. com найти сайты, кото —
рые находятся уже на Nv^izNet. com, нужно в начале ASP-страниц, расположен — ных на NVBizNet. com, вставить следующий код:
При ВЫПОЛНеНИИ ИНТерпретаТОрОМ Сценариев Метода Response. Redirect ОН
действует немедленно. Обработчик сценариев больше не обрабатывает никаких операторов на текущей ASP-странице. Вместо этого сервер посылает браузеру со — общение с указанием запросить другую Web-страницу. Значит, в нашем примере браузер сначала посылает сообщение на NVBizNet. com с запросом некоторой ASP-страницы. Но вместо того, чтобы послать браузеру страницу (находящуюся
теперь на другом сервере), сервер NVBizNet. com посылает сообщение о перенап —
равлении, согласно которому браузер должен запросить файл default. as p с сер- вера NVBizNet. com. После чего браузер запрашивает и отображает домашнюю
страницу default. as p уже с нового сервера.
Кроме отсылки посетителя на сайт, находящийся на другом Web-сервере, или
на другой сайт на том же сервере, метод Response. Redirect можно использо —
вать и для отсылки посетителя с одной страницы на другую в пределах одного и
того же сайта. Если новая страница, которую должен получить браузер, нахо — дится на том же сайте, то из URL-адреса, указываемого в методе
Response. Redirect, потребуется убрать «http:// » и доменное имя сервера, тог —
да адрес новой страницы получится относительным. Пусть, например, вы хотите запретить посетителям сразу заходить на ASP-страницы, предназначенные толь —
ко для зарегистрированных пользователей — в обход формы ввода имени и паро — ля. Тогда в начало каждой ASP-страницы, которую вы хотите защитить подоб — ным образом, необходимо вставить код наподобие следующего:
If ucase(wwwReferer) <> «HTTP://WWW. NVBIZNET. COM/HWDTT/» And _
ucase(referer) <> «HTTP://NVBIZNET. COM/HWDTT» Then
Response. Redirect «/loginScreen. asp» End If
%>
Если посетитель вводит URL-адрес Web-страницы в адресной строке брау —
зера или выбирает страницу из списка «Избранное» (или закладок), то «HTTP_REFERER» в посылаемом браузером HTTP-запросе содержит пустое зна — чение. Если же посетитель щелкнул на гиперссылке, браузер посылает серверу
HTTP-запрос, в котором значение «HTTP_REFERERM равно URL-адресу Web —
странйцы, содержащей эту гиперссылку. Таким образом, если в предыдущем примере посетитель обращается к Web-странице после ввода пароля (в форме
57 2 Глава 11. Активные серверные страницы (ASP)
авторизации) или в результате щелчка на гиперссылке на любой другой
странице, находящейся в папке /hwdtt сервера NVBizNet. com, то вызов мето —
да Request. ServerVariables вернет СТрОКу, начинающуюся С http:/ /
www. NVBizNet. com/hwdtt/ ИЛИ http://NVBizNet. com/hwdtt/:
Request. ServerVariables(«HTTP_REFERER»)
Этот оператор возвращает значение MHTTP_REFERER», которое браузер вставля —
ет в HTTP-запрос, отправляемый Web-серверу.
Чтобы использовать приведенный выше сценарий на своих Web-страницах,
подставьте в оператор i f адрес и путь к папке, содержащей информацию для за- регистрированных пользователей. Кроме того, в предпоследней строке сценария
URL-адрес, передаваемый методу Response. Redirect, необходимо заменить
URL-адресом страницы авторизации вашего сайта.
ПОСКОЛЬКУ метод Response. Redirec t ДЛЯ указания, ЧТО браузер ДОЛЖен Обра — титься к другой Web-странице, использует заголовок HTTP-сообщения, то этот метод может быть вызван сценарием только если выходной буфер HTML пуст (или содержит лишь HTTP-заголовок). Если требуется перенаправить браузер на
другую страницу после того, как сценарий уже сгенерировал часть HTML-кода
страницы, нужно сначала очистить выходной буфер с помощью метода
Response. Clear. Затем МОЖНО ВЫЗВаТЬ меТОД Response. Redirect, перенаправля —
ющий браузер на другую страницу.
Хранение значений переменных между
HTTP-запросами в cookie-наборах
Как уже упоминалось ранее, отношение клиент-сервер между Web-браузером
и Web-клиентом «не имеет состояния». Сервер не сохраняет информацию о кли — енте в промежутках между его запросами. Обычно сервер ждет, когда (любой)
браузер отправит ему HTTP-запрос. После получения запроса сервер отвечает на него, ничего не помня о предыдущих соединениях (если они были) с браузером,
приславшим запрос. Но если ваш сайт предназначен только для зарегистриро — ванных пользователей или для онлайновой торговли, то нужно как-то отслеживать посетителя, когда он переходит со страницы на страницу. В противном случае посе — титель должен будет постоянно регистрироваться, поскольку запрос на Web-страни —
цу не дает возможности серверу узнать, зарегистрирован ли уже посетитель.
Cookie-набор — это небольшой текст, который браузер по просьбе сервера за — писывает в cookie-файле Web-сайта на компьютере пользователя. Многие пользо — ватели считают это посягательством на права личности и отключают в браузере возможность сохранять cookie-наборы или, по крайней мере, заставляют браузер запрашивать разрешение перед их записью. Однако cookie-набор может содер- жать лишь данные, добровольно предоставленные пользователем, или общую ин — формацию о его соединении (взятую из HTTP-заголовка запроса Web-страницы). Более того, браузер посылает серверу лишь те cookie-наборы, которые сервер ранее послал браузеру для записи. Так что если вы посетите сайты
www. NVBizNet. com и www. yahoo. com, ваш браузер не пошлет серверу сайта
Глава 11. Активные серверные страницы (ASP) 57 3
Yahoo. com информацию, сохраненную браузером при посещении сайта
NVBizNet. com, И наоборот.
ПРАКТИКУМ
Используйт е для установк и значени й cookie-переменны х коллекци ю
Response. Cookies, а ДЛЯ ИХ выборки — КОЛЛекцИЮ Request. Cookies. Напри — мер, чтобы создать cookie-набор на один сеанс — т. е. cookie-набор, который хра — нится в системе пользователя лишь до тех пор, пока он не выйдет из Web-брау — зера — ваш сценарий должен задать только имя cookie-переменной и ее
Таким образом, чтобы установить значения односеансовых cookie-переменных
firstName И lastName соответственно В «Конрад» И «Кинг», В ASP-СЦенариЙ ПО —
требуется поместить следующий код:
Response. Cookies(«firstName») = «Конрад»
Response. Cookies(«lastName») = «Кинг»
%>
Если cookie-значение требуется сделать постоянным (т. е. чтобы оно остава — лось и после завершения сеанса), нужно присвоить его свойству Expire s либо конкретную дату, либо промежуток времени. После окончания срока действия
cookie-переменной браузер при HTTP-запросе серверу больше не будет посылать пару имя/значение cookie-переменной. Например, чтобы установить срок годно — сти cookie-переменной userName до 5 декабря 2003 года, используйте следую — щий оператор:
Аналогично для установки срока годности переменной userName в 30 дней, начиная с сегодняшнего», можно использовать встроенную функцию Date() язы —
ка VBScript:
Response .Cookies («userName») .Expires = Date + 30 %>
Предположим, например, что ваш сайт содержит форму регистрации посети —
теля наподобие приведенной на рис. 11.4, в которой текстовые элементы называ —
ются firstName, lastName, streetAddressl, streetAddress2 , city, state,
zipCode И eMailAddress.
Вы можете сохранить до даты, заданной в параметре expDate, имя посетите — ля, его почтовый адрес и адрес электронной почты, воспользовавшись в сцена — рии регистрации на своем сайте вызовом следующей подпрограммы:
1 Подпрограмма «StoreCookie» сохраняет значение cookie-переменной
Если посетитель до истечения срока годности cookie-переменных посещает
сайт еще раз, то с помощью метода Request. cookies можно загрузить значения
cookie-переменных в поля ввода регистрационной формы, как показано ниже:
•
*
Чтобы уничтожить cookie-переменную, достаточно присвоить ей пустую стро —
ку или установить ее свойство Expires равным какой-нибудь дате (или времени)
в прошлом. Например, любой из нижеследующих операторов уничтожает cookie — переменную с именем userName из cookie-файла Web-сайта:
Получение данных из формы с помощью коллекции Form
Получение данных, введенных в элементы HTML-формы, позволяет ASP-сце — нариям настраивать содержимое страницы в соответствие с требованиями и по- желаниями посетителей сайта. Конечно, сценарии на стороне сервера и без вве — денной пользователем информации могут вставлять динамическую информацию
вроде текущих даты и времени, котировок акций, информации о погоде и т. д. Но текущее время и температура в Киеве вряд ли интересует жителя Бердичева. Аналогично, текущий курс акций фирм Microsoft и General Motors мало чем пригодится владельцам акций других компаний и вообще не интересен держате — лю облигаций. Чтобы быть полезными, сценарии на стороне сервера, генерирую — щие содержимое страницы, должны сначала выяснить, о чем бы хотел узнать по — сетитель, а потом предоставить ему запрошенную информацию. К счастью, Web-сервер может предоставить вашему сценарию данные, введенные в HTML — форму, в виде коллекции пар имя/значение в ASP-объекте Request.
После того как посетитель заполнит текстовые элементы формы, выберет зна — чения переключателей и списков выбора и щелкнет на кнопке отправки формы, браузер посылает данные, принятые из формы, серверу. Атрибуты action и method дескриптора
После щелчка пользователя на кнопке «Отправить» браузер с помощью метода
POST посылает данные, принятые из формы, Web-серверу. После этого сервер выбирает из HTTP-сообщения, посланного браузером, данные, принятые из фор — мы, в виде пар имя/значение и заносит их в коллекцию ASP-страницы
Request. Form.
ПРАКТИКУМ
Коллекция ASP-страницы — это массив значений, которые сценарий может вы — бирать по числовому индексу или по ключевому слову. Удобно, что сценарий
для доступа к значению элемента коллекции Request. Form может в качестве ключевого слова использовать имя элемента формы. Поэтому для доступа к дан — ным, принятым из формы, которая определена в предыдущем примере, можно воспользоваться следующим сценарием:
Чтобы не нарушить конфиденциальность данных, принятых из формы, в дес- крипторе
следует установить атрибут method равным POST — тогда брау — зер отправит эти данные в теле HTTP-сообщения. Метод POST можно использо — вать для приема подробностей заказа или имени, адреса и номера телефона
посетителя. Если же форма содержит очень важные данные, такие как номер кредитной карточки, имя пользователя и его пароль или номера счетов, то мож — но установить защищенное соединение между браузером и сервером. При ис — пользовании метода POST для пересылки данных, принятых из формы, по защи- щенному соединению данные передаются через Internet в теле HTTP-сообщения
в зашифрованном виде.
И наоборот, если вы хотите записывать данные, принятые из формы, в файле протокола на сервере для последующего анализа или же позволить посетителям создавать закладки (или список избранных данных), которые можно использо — вать в дальнейшем для автозаполнения формы, то атрибут method дескриптора
В данном примере сценарий сначала выбирает значения элементов формы по
ИХ именам ИЗ КОЛЛекЦИИ Request. QueryStrin g И Присваивает ЭТИ Значения ЭЛе —
ментам массива symbol. Затем для отображения всех значений, принятых из
Web-страницы, вызывается метод Response. write. Разумеется, ваш сценарий бу — дет проводить более осмысленную обработку принятых значений. В любом слу — чае важно помнить, что вы выбираете значения, принятые из формы с помощью
метода GET, ИЗ КОЛЛекЦИИ Request. QueryString. Кроме ТОГО, Значения всех элементов можно получить по их именам.
580 Глава 11. Активные серверные страницы (ASP)
Вообще-то обычно значения элементов формы выбираются по их именам — если эти имена осмысленны. Однако в предыдущем примере имена элементов формы никак не описывают их значения. Поэтому в данном случае значения
элементов формы удобнее выбирать из коллекции Request. Querystring не по именам, а по их числовым индексам, как показано ниже:
!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Transitional//EN»>
DIM symbol(6), I
1 Получение и отображение имен и значений данных, введенных в форму