При обсуждении содержимого объекта Request одной из коллекций для изучения является коллекция ServerVariables. Этот набор содержит комбинацию значения в заголовке HTTP, отправленного клиентом на сервер с запросом страницы, и значения, предоставленного самим сервером при получении запроса.
Значение, возвращаемое
«самоссылающейся» страницей
в коллекции ServerVariables, содержит сведения о веб-сервере и информацию о пути к текущей странице.Эту информацию можно использовать везде, где вы создаете страницу. Например, чтобы создать страницу «самоссылки», которая может снова вызывать себя для выполнения другой задачи, мы можем использовать следующий код:
<FORM ACTION="<% = Request.ServerVariables("PATH_INFO") %>" METHOD= «POST ”>
Тот же эффект можно получить с помощью значения HTTP «SCRIPT_NAME»:
<FORM ACTION="<% = Request.ServerVariables(“SCRIPT_NAME”) %>” METHOD="POST">
Используйте элемент <A> для открыть другую страницу. Вы можете использовать:
...
<%
strFullPath = Request.ServerVariables("PATH_INFO")
'Удалить имя файла
strPathOnly = Left(strFullPath, InStrRev(strFullPath, «/»))
strNextPage = strPathOnly & «pages/next_page.asp»
%>
...
<A HREF="<% = strNextPage %>">Следующая страница</A>
...
эти примеры работают, даже если имя или местоположение исходной страницы изменяются, поскольку используется информация о пути текущей страницы (конечно, второй пример терпит неудачу, когда изменяется имя отдельной целевой страницы).
Другими словами, если URL-адрес автоматически создается для подсеанса поисковой системы, можно собрать некоторые значения ServerVariable:
strFullURL = http:// & Request.ServerVariables("LOCAL_ADDR") _
& ":" & Request.ServerVariables("SERVER_PORT") _
& Request.ServerVariables("PATH_INFO")
Это создаст полный URL-адрес, включая номер порта (в данном случае это не стандартное значение 80). Например, результатом может быть:
http://194.74.60.254:1768/thispath/thispage.asp
Определение версии браузера
Еще одним полезным значением в коллекции ServerVariables является строка пользовательского агента браузера пользователя. На странице «Определение типа браузера» (browsertype.asp) значение «HTTP_USER_AGENT» в коллекции ServerVariables используется для получения строки пользовательского агента. Некоторые сценарии используются для анализа этой информации и поиска имени производителя и версии браузера.
<%
strUA = Request.ServerVariables("HTTP_USER_AGENT")
Ответ. Напишите «Строка пользовательского агента — <B>» и strUA & «</B>».
"
Если InStr(strUA, «MSIE») Тогда
Ответ. Напишите «Чтобы обновить браузер, перейдите по адресу «_».
& «<A HREF=" & Chr(34) & http://www.microsoft.com/ie/ ”_
& Chr(34) & «> http://www.microsoft.com/ie/ <A>
"
intVersion = Cint(Mid(strUA, InStr(strUA, «MSIE») + 5, 1))
Если intVersion >=4 Тогда
Ответ. Напишите «Вы можете использовать Microsoft Dynamic HTML».
Конец, если
Еще
Если InStr(strUA, «Mozilla») Тогда
Если InStr(strUA, «совместимый;») = 0 Тогда
Ответ. Напишите «Ваш браузер, вероятно, Навигатор. Можно»_.
& «загрузите последнюю версию Навигатора с сайта «_
& «<A HREF=" & Chr(34) & http://home.netscape.com/ ”_
& «загрузить/»& Chr(34) & «> http://home.netscape.com »_
& «/download/</A>
"
intVersion = Cint(Mid(strUA, InStr(strUA, «/») +1, 1))
Если intVersion >= 4 Тогда
Ответ. Напишите: «Вероятно, вы можете использовать Netscape Dynamic HTML».
Конец, если
Еще
strVersion = Mid(strUA, InStr(strUA, «совместимый;») + 12)
strProduct = Left(strVersion, InStr(strVersion, " "))
Ответ. Напишите «Ваш браузер совместим с Навигатором. Можно»_.
& «найти производителя с помощью поисковой системы, например»_
& «<A HREF=" & Chr(34) _
& «http://www.altavista.digital.com/cgi-bin/query?q=»_
&strProduct_
& Chr(34) & «> http://www.altavista.com/ </A>
"
Конец, если
Конец, если
Конец, если
%>
Результаты поиска для IE 5.0 и Navigator 4.61 различаются соответственно. Для браузеров других производителей вы можете получить ссылку для автоматического запуска поиска имени производителя на веб-сайте Alta Vista.
Обратите внимание, что Netscape не предоставляет название производителя в строке пользовательского агента, поэтому нет абсолютной гарантии, что браузер является браузером Navigator.
Определение языка браузера
Еще одно полезное значение в коллекции ServerVariables — «HTTP_ACCEPT_LANGUAGE», которое содержит код языка, который указывается при установке браузера или жестко запрограммирован в региональной версии пользователя. Примеры языковых кодов: en-us (Великобритания, США), de-at (Германия, Австралия) и es-pe (Испания, Перу).
Коды языков могут быть общими и не содержать идентификаторов диалекта: например, на нашем сайте Wrox большое количество посетителей используют en (английский) в качестве кода языка.
Таким образом, можно определить код языка и автоматически загрузить соответствующую версию страницы для конкретного региона или языка.
StrLocale = Lcase(Left(Request.ServerVariables("HTTP_ACCEPT_LANGUAGE"),2))
Выберите регистр strLocale
Случай «en»: Response.Redirect «http://uk_site.co.uk/».
Случай «de»: Response.Redirect «http://de_site.co.de/»
Случай «fr»: Response.Redirect «http://fr_site.co.fr/»
'...и т. д
Другой случай: Response.Redirect «http://us_sitel.com/»
Конец Выберите
или перенаправьте страницу на основе определенного диалекта:
strLocale = Lcase(Request.ServerVariables("HTTP_ACCEPT_LANGUAGE"))
Выберите регистр strLocale
Случай «en-gb»: Response.Redirect «http://uk_site.co.uk/»
Случай «en-us»: Response.Redirect «http://us_site.com/»
Случай «es-pe»: Response.Redirect «http://es_site2.co.pe/»
'...
Другой случай: Response.Redirect «http://us_site1.com/»
End Select
Другие полезные значения коллекции ServerVariables
могут получить доступ к любому члену коллекции ServerVariables и использовать их для управления тем, как страница ASP отвечает на запрос. Вы можете проверить, зашел ли посетитель на сайт, используя порт по умолчанию 80 или другой. В этом примере найдите доступ через порт 443, который обеспечивает доступ Secure Socket Layer (SSI) (и другие протоколы), и перенаправьте их на соответствующую страницу.
Если Request.ServerVariables("SERVER_PORT") = "443") Тогда
Response.Redirect "/securesite/default.asp" 'Безопасный пользователь
Еще
Response.Redirect «/normalsite/default.asp» 'Незащищенный пользователь
Конец Если
браузеру требуется зарегистрироваться и пройти проверку на сервере (вместо того, чтобы разрешить ему анонимный доступ под учетной записью IUSER веб-сервера, этот вопрос будет подробно обсуждаться в следующей главе), имя пользователя может быть запрашивается для определения пользователя, который с нами имеет дело. Кто это и нужно ли загружать страницу этому пользователю. Например, следующий код будет отображать ссылку администрирования только для пользователей с именем Администратор.
...
<A HREF="dispcnfg.asp">Изменить конфигурацию отображения</A>
<A HREF="dispcolr.asp">Изменить цвета дисплея</A>
<A HREF="keyboard.asp">Изменить конфигурацию клавиатуры</A >
<%
Если Request.ServerVariables("AUTH_USER") _
= Ucase(Request.ServerVariables("SERVER_NAME")) & "Administrator" Тогда
%>
<A HREF="allusers.asp">Администрирование всех пользователей</A>
<A HREF="usrlogon.asp">Администрирование информации для входа в систему</A>
<%
Конец, если
%>
...
обратите внимание, что ASP не заполняет коллекцию ServerVariables, пока вы не получите доступ к одному из ее членов. Доступ к члену этой коллекции в первый раз приведет к тому, что IIS получит все это, коллекцию ServerVariables следует использовать только при необходимости.
Другие методы запросов и ответов
Теперь давайте рассмотрим несколько полезных методов использования объектов Request и Response, в том числе:
· Управление соединениями, буферизацией и перенаправлением страниц.
· Работа с HTTP-заголовками, кэшированием и страницами «истечения срока действия».
· Использование клиентских сертификатов.
· Создание индивидуальных сообщений в файле журнала.
1. Управление соединениями, буферизацией и перенаправлением страниц.
Очень полезная функция ASP — предоставить пользователям возможность перенаправляться с одной веб-страницы ASP на другую веб-страницу (ASP или HTML) или в другой исходный файл (например, ZIP-файл или текстовый файл). файл) ). Это прозрачно для пользователя, на самом деле всю работу выполняет браузер. При использовании метода Response.Redirect для загрузки новой веб-страницы клиенту фактически отправляется специальный HTTP-заголовок. Этот заголовок:
HTTP/1.1 302 Объект перемещен.
Location /newpath/newpage.asp
Браузер считывает эту информацию заголовка и загружает страницу в соответствии со значением Location. Функционально это аналогично использованию клиентского HTML-тега <META> на веб-странице, например:
<META HTTP-EQUIV="REFRESH" CONTENT="0;URL=
/newpath/newpage.asp">.
Проблема в том, что прокси-сервер между сервером и пользователем может предоставить собственное сообщение, содержащее ссылку на новую страницу, вместо того, чтобы загружать новую страницу напрямую. И браузеры могут выполнять ту же работу в зависимости от производителя и версии. Это устраняет предполагаемую прозрачность и делает доступ к вашему сайту более затруднительным для пользователей, поскольку они продолжают получать сообщения об ошибках.
После отправки любого содержимого страницы, такого как текст или HTML, мы больше не можем использовать метод Redirect. Однако один из способов ограничить «влияние прокси-сервера» — это сначала убедиться, что никакие выходные данные (включая заголовки HTTP) не отправляются клиенту. В ASP 2.0 необходимо включить буферизацию, а затем использовать метод Clear для очистки буфера:
Response.Buffer = True
'Некоторые условия для выбора соответствующей страницы:
Если Request.ServerVariables("SERVER_PORT") = 1856 Тогда
StrNewPage = «/newpath/this_page.asp»
Еще
StrNewPage = «/newpath/the_other_page.asp»
Конец, если
Ответ.Очистить
Response.Redirect strNewPage
В ASP 3.0 буферизация включена по умолчанию, поэтому первую строку можно игнорировать, но она безвредна и гарантирует, что наша веб-страница будет работать даже в среде ASP 2.0.
Вместо использования этого типа перенаправления HTTP-заголовка лучше использовать новую функцию ASP 3.0, которая позволяет нам преобразовывать для выполнения другую веб-страницу с помощью метода передачи объекта «Сервер». Мы будем изучать этот вопрос дальше в будущем. .
1) Страничный буфер ASP
Как вы видели, страничный буфер ASP 3.0 включен по умолчанию в IIS 5.0 и выключен по умолчанию в более ранних версиях. Microsoft сообщает нам, что буферизация обеспечивает более эффективную доставку веб-страниц в IIS 5.0, поэтому состояние буферизации по умолчанию было изменено. В большинстве случаев на нас это никак не влияет. Однако если у вас очень большая веб-страница или веб-страница, создание которой с использованием ASP или другого серверного кода и компонентов занимает некоторое время, по мере завершения ее частей мы можем обновить их для клиента пакетами:
.. .
... Код для создания первой части страницы
...
Ответ.Flush
...
... Код для создания следующей части страницы
...
Ответ.Flush
...
иногда вам может потребоваться остановить выполнение кода в какой-то момент до конца страницы, вызвав метод End, чтобы обновить все текущее содержимое для клиента и прервать любую дальнейшую обработку.
...
... Код для создания первой части страницы
Если strUserName = "" Тогда Response.Clear
...
... Код для создания новой версии этой части страницы
...
Вот два примера веб-страниц, демонстрирующих буферизацию и перенаправление, которые можно загрузить с главной страницы «Объект ответа» (sow_response.asp). Первая примерная веб-страница Response.Redirect называется redirect.asp. Она вставляет некоторое содержимое в буферизованную страницу, очищает буфер и перенаправляет на другую веб-страницу:
Для intLoop = 1 To 1000000.
Ответ. Напишите "."
Следующий
Ответ.Очистить
Response.Redirect "show_redirect.asp"
Response.End
show_response.asp выполняет ту же работу, но перенаправление происходит обратно на домашнюю страницу «Объект ответа». Поскольку эти страницы буферизуются и весь вывод должен быть очищен перед перенаправлением, в браузере нет видимого вывода. Однако каждое происходящее перенаправление можно увидеть, наблюдая за состоянием браузера. Как показано на рисунке ниже:
<img src=/u/info_img/2009-06/25/asp14.jpg>
На домашней странице «Объект ответа» щелкните ссылку «Response.Flush», чтобы открыть второй пример веб-страницы. usebuffer.asp. Он просто перебирает каждый символ строки и передает его клиенту с определенной задержкой. Хотя это очень неэффективное использование веб-серверов и ASP, оно демонстрирует, как работает буферизация.
<img src=/u/info_img/2009-06/25/asp15.jpg>
Ниже приведен необходимый минимальный код ASP. Обратите внимание, что мы обновляем каждый символ в браузере отдельно, поскольку в противном случае он будет храниться в буфере до тех пор, пока не будет сохранен. веб-страница завершена:
strText = «Этот текст был сброшен в браузер с помощью « & _»
"<B>Response.Flush</B>
"
Для intChar = 1 To Len(strText)
Для intWrite = от 1 до 100000
Следующий
Response.Write Mid(strText,intChar,1)
Ответ.Flush
Далее
2) Свойство Response.IsClientConnected
Свойство IsClientConnected уже существует в ASP 2.0, но оно несколько ненадежно. Некоторые выходные данные должны быть отправлены клиенту, прежде чем он вернет точный результат. Эта проблема была решена в ASP 3.0. Теперь это свойство можно использовать свободно.
IsClientConnected — это полезный способ проверить, подключен ли пользователь к серверу и загружает ли веб-страницу, созданную ASP. Если пользователь отключается или прекращает загрузку, нам больше не придется тратить ресурсы сервера на создание веб-страницы, поскольку содержимое буфера будет удалено IIS. Поэтому для веб-страниц, на расчет которых требуется много времени или которые используют много ресурсов, стоит на каждом этапе проверять, находится ли браузер в автономном режиме:
...
... Код для создания первой части страницы
...
Если Response.IsClientConnected Тогда
Ответ.Flush
Еще
Ответ.Конец
Конец, если
...
... Код для создания следующей части страницы...