Модификация ответа HTTP (HTTP Response) при помощи фильтров - Применение фильтра ответа (Response Filter)

ОГЛАВЛЕНИЕ

Применение фильтра ответа (Response Filter)

Объект Response имеет свойство Filter , которое используется для связки фильтров ответа в цепь. Вы можете установить данное свойство тремя способами:

  • С определенной веб-страницы. Со страницы вы можете установить свойство Response.Filter. Это работает для определенных страниц, которые имеют следующий код. Добавьте следующий код к обработчику события Page_Load страницы и примените фильтр ответа:
    Response.Filter = new ResponseFilterClassName(Response.Filter)

    В случае с фильтром WhitespaceFilterVB код будет выглядеть следующим образом:

    Response.Filter = new WhitespaceFilterVB(Response.Filter)
  • Из соответствующего обработчика события в Global.asax. Фильтры ответа применяются после события PostReleaseRequestState объекта HttpApplication. Поэтому, вы можете добавить фильтр ответа во время данного события или раньше. К примеру, следующий обработчик события в Global.asax добавляет фильтр WhitespaceFilterVB ко всем страницам с содержимым типа "text/html" (ContentType):
    Sub Application_PostReleaseRequestState(ByVal sender As Object, ByVal e As EventArgs)
       If Response.ContentType = "text/html" Then
          Response.Filter = New WhitespaceFilterVB(Response.Filter)
       End If
    End Sub
  • Из HTTP Module. HTTP Module являются управляемыми классами, которые могут отвечать на события приложений (такие, как PostReleaseRequestState). HTTP Module может быть использован для установки свойства Response.Filter.

Загрузите пример, доступный в конце данной статьи, чтобы увидеть фильтр WhitespaceFilterVB в действии. Домашняя страница примера (Default.aspx) содержит два элемента TextBox - первый показывает оригинальное содержимое страницы WhitespaceFilterDemo.aspx, что включает в себя символы перехода каретки, табуляцию и множество пробелов - все в 2,603 битах. Второй элемент TextBox на странице демонстрирует содержимое страницы WhitespaceFilterDemo.aspx, просматриваемое в обозревателе. Избыток пробелов был исправлен, сократив размер обрабатываемого содержимого до 2,282 бита. Следующий рисунок демонстрирует страницу Default.aspx в действии.

Связываем множество фильтров ответа в цепи

Как мы только что увидели, существует возможность связывания специализированного фильтра ответа между объектом HttpWriter и выходящим потоком, но вас ничего не остановит от связывания всего лишь одного потока. Приложение данной статьи включает в себя второй фильтр ответа, названный AddCopyrightFilter , который внедряет сообщение о правах в нижней части всех страниц, к которым он был применен. В частности, он добавляет следующее содержимое сразу же после закрывающего тега </body>:

<div class="Copyright">
   Copyright Scott Mitchell CurrentYear
</div>

Данный принцип может быть расширен таким образом, чтобы он внедрял другие типы стандартной разметки на страницах, такие как JavaScript , используемый веб-инструментами, как Google Analytics или счетчиками посещаемости веб-сайта.

Фильтр AddCopyrightFilter расширяет класс MemoryStream и перегружает его метод Write , но работает немного по-другому, чем WhitespaceFilter. Вместо обработки каждой части данных, которые приходят в метод Write, AddCopyrightFilter буферизирует входящие данные в StringBuilder. Как только  буфер содержит "</html>", он внедряет сообщение о правах и высылает полный текст буфера в следующей поток цепи. (Данное поведение предполагает, что страницы, с которыми работает фильтр, заканчиваются текстом "</html>". Если данный фильтр будет использоваться на странице, которая не заканчивается тегом "</html>" , то клиенту ничего не будет выслано!)

Фильтры ответа AddCopyrightFilter и WhitespaceFilter могут быть связаны в цепь. К примеру, вы можете установить свойство Response.Filter следующим образом :

Response.Filter = new AddCopyrightFilter(new WhitespaceFilter(Response.Filter))

Приложение, доступное в конце статьи, не использует в точности тот код, который я указал выше, но вместо этого реализует цепь фильтров связывая AddCopyrightFilter в Global.asax и WhitespaceFilter в WhitespaceFilterDemo.aspx класса с фоновым кодом страницы.

Вывод

Фильтры ответа (Response filters) это механизм, которым разработчик может программно исследовать и модифицировать поток выходящих данных после того, как содержимое веб-страницы было обработано, но до того, как данные были возвращены клиенту. Фильтры ответа могут быть использованы для компрессии либо модификации выходящих данных, как к примеру добавление сообщения о правах или стандартный текст. Данная статья рассмотрела два примера фильтров ответа: один удалял лишние пробелы из обработанного HTML-кода, а другой добавлял сообщение о правах на сайт в нижней части всех страниц, к которым был применен фильтр.

Веселого программирования!

Scott Mitchell

Скачать исходники примеров к статье