Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Федеральное агентство по образованию
ГОУ ВПО «ОМСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
(ОМГТУ)
Кафедра «Автоматизированные системы обработки информации и управления»
Курсовая работа
По дисциплине «ООП на Java»
По теме «Фильтры в сервлетах и JSP»
Принял: | |
Подпись, дата | |
Выполнил: Студент ЗАС-220 Ю. | |
Подпись, дата |
Омск-2011
Реферат
Курсовой проект, 40 с., 13 рис., 13 источников, 1 приложение.
Фильтр, интерфейс, servlet, jsp, http, filter config, filter chain, web-приложение, дескриптор развертывания, оборачивание запросов и ответов, Диспетчер запросов
Объектом исследования курсового проекта является внедрение технологии фильтров в web-приложение.
Проект создан с целью изучения базовых понятий о фильтрах в контексте технологий Java Servlet и JSP.
Работа проводилась с использованием среды разработки IDE NetBeans 5.5, специально приспособленной для создания web-приложений, со встроенным сервером приложений Tomcat 5.5.17, а также с учетом последних изменений в Java Servlet Specification [9].
В результате проведенных исследований созданы Java-классы фильтров, которые могут быть применены в реальных Интернет-проектах, а также собрана и систематизирована информация по теме фильтров.
Фильтрация – это один из ряда наиболее важных моментов в бизнес-логике web-приложения, поэтому внедрение и использование фильтров на современном этапе разработок web-приложений является достаточно важным.
Содержание
Реферат. 1
Содержание. 3
Введение. 4
1 Основная часть. 5
1.1 Что такое фильтр?. 5
1.2 Жизненный цикл фильтра. 6
1.3 Оборачивание запросов и ответов. 7
1.4 Окружение фильтра. 7
1.5 Конфигурация фильтров в web-приложении. 7
1.6 Фильтры и диспетчер запросов (RequestDispatcher) 9
1.7 Примеры.. 10
Заключение. 19
Список использованных источников. 20
. 21
Example 1. 21
Example 2. 28
Example 3. 32
Example 4. 34
Example 5. 38
Введение
Впервые фильтрация сервлетов появилась в API сервлета версии 2.3 в 2001 году.
Фильтрация – это мощная технология, предназначенная для разработчиков сервлетов, позволяющая генерировать цепочки Java-классов, последовательно выполняющихся в ответ на запрос клиента.
В современных web-приложениях на базе Java фильтры используются повсеместно.
Поэтому в работе подробно рассмотрен процесс создания фильтров, а также приведены примеры, позволяющие на практике понять принцип действия системы фильтрации запросов.
Фильтрам посвящено множество статей в Интернете. В них описываются особенности применения этой технологии.
API сервлетов непрерывно совершенствуется. В 2004 году была выпущена новая спецификация (версия 2.4) [9], в которой фильтры получили свое дальнейшее развитие. В проекте также рассмотрены нововведения в Java™ Servlet Specification 2.4 касательно фильтров.
Основная цель работы – ознакомиться с технологией фильтров и систематизировать информацию о них.
1 Основная часть
1.1 Что такое фильтр?
Фильтр – это многократно используемая часть кода, которая может преобразовывать содержание HTTP запросов, ответов и заголовков. Фильтры в общем не генерируют ответ и не отвечают на запрос, как сервлеты, скорее они модифицируют или адаптируют запросы ресурса или модифицируют и адаптируют ответы от ресурса.
Фильтры могут влиять на динамическое и статическое содержимое.
Среди типов функциональности, доступных автору фильтра такие:
1. Доступ к ресурсу до того, как запрос на него активизируется.
2. Обработка запроса ресурса до его запуска.
3. Модификация заголовков запроса и данных с помощью «упаковки» запроса в пользовательскую версию объекта запроса.
4. Модификация заголовков ответа и данных ответа, путем предоставления пользовательской версии объекта ответа.
5. Перехват вызова ресурса после того, как он уже вызван.
6. Воздействие на сервлеты, группы сервлетов или на статическое содержимое с помощью ни одного, одного или более фильтров в специфическом порядке.
Примеры фильтрующих компонентов:
· фильтр аутентификации
· фильтр регистрации и контрольной проверки
· фильтр сжатия изображения
· фильтр сжатия данных
· фильтр шифрования
· фильтр, создающий пометки
· фильтр, инициирующий события по доступу к ресурсу
· XSL/T-фильтры, которые преобразуют XML содержимое
· цепочка фильтров MIME-type
· фильтры кэширования
Разработчик приложения создает фильтр, реализуя интерфейс javax. servlet. Filter и снабжая его public-конструктором без аргументов. Класс упаковывается в web-архив вместе со статическим содержимым и сервлетами, которые составляют web-приложение. Фильтр объявляется с помощью элемента <filter> в дескрипторе развертывания. Фильтр или набор фильтров могут быть сконфигурированы для запуска путем определения элементов <filter-mapping> в дескрипторе развертывания. Это осуществляется при назначении фильтра определенному сервлету с помощью логического имени сервлета или группе сервлетов и статическому содержимому ресурсов (фильтру назначается шаблон URL).
1.2 Жизненный цикл фильтра
После “запуска” web-приложения и до того, как запросы потребуют от контейнера доступ к web-ресурсу, контейнер должен определить список фильтров, которые должны быть применены к web-ресурсу, как описано далее. Контейнер должен убедиться, что он создал объект фильтра соответствующего класса для каждого фильтра в списке, и вызвал его init (FilterConfig config) метод. Фильтр может сгенерировать исключение, чтобы показать, что не может функционировать должным образом. Если тип исключения – UnavailableException, то контейнер может проверить атрибут isPermanent и снова запустить фильтр некоторое время спустя.
Только один объект, соответствующий объявлению <filter> в дескрипторе развертывания, создается виртуальной Java машиной контейнера (JVM™). Контейнер предоставляет доступ к объекту фильтра config, как описано в дескрипторе развертывания, к ссылке на ServletContext web-приложения, а также к множеству параметров инициализации.
Когда контейнер получает входящий запрос, он берет экземпляр первого фильтра из списка и вызывает его метод doFilter, передавая ему ServletRequest, ServletResponse и ссылку на объект FilterChain, который он использует.
Реализовать метод doFilter можно, следуя одному или нескольким нижеуказанным шаблонам:
1. Метод проверяет заголовки запроса.
2. Метод может обернуть объект запроса специализированной реализацией ServletRequest или HttpServletRequest для того, чтобы модифицировать в запросе заголовки или данные.
3. Метод может обернуть объект ответа, передающийся в метод doFilter с помощью специализированной реализации ServletResponse или HttpServletResponse, чтобы модифицировать в ответе заголовки или данные.
4. Фильтр может запускать следующий модуль в цепочке фильтров. Следующим модулем может быть другой фильтр или, если запускаемый фильтр последний в цепи фильтров, сконфигурированных в дескрипторе развертывания, следующий модуль – это конечный web-ресурс. Вызов следующего модуля осуществляется путем вызова метода doFilter на объекте FilterChain и передачи в него запроса и ответа, с которыми фильтр был вызван, или их обернутых версий, которые он мог создать. Реализация метода doFilter в цепочке фильтров, предоставляемая контейнером, должна определять следующий модуль в цепочке фильтров и запускать его метод doFilter, передавая в него соответствующие объекты запроса и ответа. Наоборот, цепочка фильтров может заблокировать запрос, не вызывая следующий модуль, предоставляя тем самым фильтру ответственность за заполнение объекта ответа.
5. После запуска следующего фильтра в цепи фильтр может проверить заголовки ответа.
6. В качестве альтернативы фильтр может сгенерировать исключение, чтобы сообщить об ошибке в обработке. Если фильтр генерирует UnavailableException в течение выполнения своего метода doFilter, контейнер должен не допустить продолжения обработки дальше по цепочке фильтров. Он может выбрать следующую стратегию: перезапустить всю цепь через некоторый промежуток, если исключение не помечено как «долговременное».
7. Когда последний в цепи фильтр запущен, следующий модуль, к которому идет доступ – это целевой сервлет или ресурс в конце цепи.
8. Перед тем как экземпляр фильтра может быть удален из обслуживания контейнером, контейнер обязан сначала вызвать метод destroy на объекте фильтра, чтобы позволить фильтру освободить какие-либо ресурсы или провести другие операции по чистке.
1.3 Оборачивание запросов и ответов
Центральной идеей фильтрации является концепция оборачивания запроса или ответ так, что можно переопределить их поведение для выполнения задачи фильтрации. В данной модели разработчик может не только переопределить существующие методы объектов запроса и ответа, но и обеспечить их новым API (программным интерфейсом приложения), подходящим для определенной задачи фильтрации. Например, разработчик может захотеть расширить объект ответа с помощью объектов более высокого уровня вывода, такими, что поток вывода или writer будет такой, как API, позволяющий отправлять DOM-объекты назад клиенту.
Чтобы поддержать такой стиль фильтра, контейнер должен поддерживать следующие требования. Когда фильтр запускает метод doFilter на выполняемой контейнером цепи фильтров, контейнер должен убедиться, что объекты запроса и ответа, которые фильтр передает следующему модулю в цепи фильтров или конечному web-ресурсу, если фильтр оказался в цепи последним, те же, что были переданы в метод doFilter при вызове данного фильтра.
Такое же требование идентичности обернутого объекта применяется и к вызовам из сервлета или фильтра команд RequestDispatcher. forward и RequestDispatcher. include, когда вызывающий модуль оборачивает объекты запроса или ответа. В этом случаем объекты запроса и ответа, видимые вызванному сервлету, должны быть теми же обернутыми объектами, что были переданы при вызове сервлета или фильтра.
1.4 Окружение фильтра
Набор параметров инициализации может быть ассоциирован с фильтром с помощью элемента <init-param> в дескрипторе развертывания. Имена и значения этих параметров доступны фильтру во время выполнения с помощью методов getInitParameter и getInitParameterNames, запущенных на объекте фильтра FilterConfig. Также с помощью FilterConfig можно получить доступ к ServletContext web-приложения для загрузки ресурсов, регистрации выполняемых функций и хранения структур в списке атрибутов ServletContext.
1.5 Конфигурация фильтров в web-приложении
Фильтр объявляется в дескрипторе развертывания с помощью элемента <filter>. В нем программист описывает следующее:
· filter-name: используется для назначения фильтра сервлету или URL
· filter-class: используется контейнером для определения типа фильтра
· init-params: параметры инициализации для фильтра
При желании программист может определить пиктограммы, текстовые описания и отображаемое имя для манипуляций фильтром с помощью инструментальных средств. Контейнер должен приписать значение только одному экземпляру Java-класса, определяя фильтр соответственно его описанию в дескрипторе развертывания. Значит, два экземпляра одного фильтра будет создано контейнером, только если разработчик сделает два объявления для одного и того же класса фильтра.
Вот пример объявления фильтра:
<filter>
<filter-name>Image Filter</filter-name>
<filter-class>com. filters. ImageServlet</filter-class>
</filter>
Как только фильтр определен в дескрипторе развертывания, сборщик использует элемент <filter-mapping> для определения сервлетов и статического содержимого web-приложения, к которым фильтр применяется. Фильтры могут быть ассоциированы с сервлетом с помощью элемента <servlet-name>. Например, следующий код показывает назначение фильтра Image Filter сервлету ImageServlet:
<filter-mapping>
<filter-name>Image Filter</filter-name>
<servlet-name>ImageServlet</servlet-name>
</filter-mapping>
Фильтры могут быть ассоциированы с группой сервлетов и статического содержимого при использовании стиля назначения фильтра <url-pattern>:
<filter-mapping>
<filter-name>Logging Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Здесь Logging Filter применяется ко всем сервлетам и страницам со статическим содержимым в web-приложении, т. к. URI запроса совпадает с “/*” шаблоном URL. Во время обработки элемента <filter-mapping> с помощью стиля <url-pattern>, контейнер должен определить соответствует ли <url-pattern> URI запроса.
Порядок, который контейнер использует для построения цепочки фильтров, применяемых к определенному URI запроса, таков:
1. Сначала <url-pattern> подбирает назначенные фильтры в том порядке, в каком элементы появляются в дескрипторе развертывания.
2. Дальше <servlet-name> подбирает назначенные фильтры в том порядке, в котором эти элементы появляются в дескрипторе развертывания.
Такие требования означают, что контейнер, когда получает входящий запрос, обрабатывает запрос следующим образом:
· определяет конечный web-ресурс.
· если есть фильтры, назначенные имени сервлета, и web-ресурс содержит <servlet-name> элемент, контейнер строит цепочку назначенных фильтров в том порядке, в котором они объявлены в дескрипторе развертывания. Последний фильтр в этой цепи соответствует последнему назначенному фильтру с элементом <servlet-name> и это тот фильтр, который запускает конечный web-ресурс.
· Если есть фильтры с назначением <url-pattern> и <url-pattern> совпадает с URI запроса, то контейнер строит цепь фильтров, у которых совпадает <url-pattern>, в том порядке, в котором они объявлены в дескрипторе развертывания. Последний фильтр в этой цепи – это последний фильтр с данным <url-pattern> в дескрипторе развертывания для URI обрабатываемого запроса. Последний фильтр в цепи – это фильтр, который запускает первый фильтр из следующей цепи, назначенной через <servlet-name>, или запускает целевой web-ресурс, если такого фильтра нет.
Предполагается, что высокоуровневые web-контейнеры кэшируют цепи фильтров, поэтому им не надо рассчитывать их при каждом запросе.
1.6 Фильтры и диспетчер запросов (RequestDispatcher)
В спецификации Java Servlets 2.4 появилась возможность конфигурировать фильтры для запуска при вызове методов forward() и include() диспетчера запросов.
Используя новый элемент <dispatcher> в дескрипторе развертывания, разработчик может указать с помощью прикрепления фильтра, хочет ли он, чтобы фильтр применялся к запросам, когда:
1. Запрос идет прямо от клиента
Это указывается при помощи элемента <dispatcher> со значением REQUEST или отсутствием какого-либо элемента <dispatcher>.
2. Запрос обрабатывается диспетчером запросов, который представляет собой web-компонент, соответствующий <url-pattern> или <servlet-name>, при вызове forward().
Это указывается при помощи элемента <dispatcher> со значением FORWARD.
3. Запрос обрабатывается диспетчером запросов, который представляет собой web-компонент, соответствующий <url-pattern> или <servlet-name>, при вызове include().
Это указывается при помощи элемента <dispatcher> со значением INCLUDE.
4. Запрос обрабатывается при помощи механизма “error page” “ресурсом ошибок”, соответствующим <url-pattern>.
Это указывается при помощи элемента <dispatcher> со значением ERROR.
5. Или комбинация вышеуказанных пунктов.
Например:
<filter-mapping>
<filter-name>Login Filter</filter-name>
<url-pattern>/products/*</url-pattern>
</filter-mapping>
После этого фильтр Login Filter будет запускаться каждый раз, когда запрос клиента будет начинаться с /products/….
Следующий пример кода позволит вызывать тот же фильтр при вызове метода include() в сервлете или при использовании jsp-директивы include в запрашиваемой странице:
<filter-mapping>
<filter-name>Login Filter</filter-name>
<servlet-name>ProductServlet</servlet-name>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
В этом случае Login Filter будет запускаться не при обычном запросе этого сервлета, а при вызове метода include() диспетчера запросов, содержащем ссылку на ProductServlet.
Рассмотрим еще один фрагмент:
<filter-mapping>
<filter-name>Login Filter</filter-name>
<url-pattern>/products/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
Вызов фильтра Login Filter будет осуществляться при обычных запросах клиентов и при вызове метода forward() диспетчера запросов, содержащем ссылку на /products/….
1.7 Примеры
Воспользовавшись минимумом вышеуказанной теории, а также знаниями о сервлетах и jsp-страницах, в ходе выполнения работы было создано несколько реальных примеров, отображающих действие фильтров.
1.7.1 Example 5
Данный пример демонстрирует работу фильтра по сжатию данных (для наглядности используется обычный вывод в поток, соответствующий ответу клиенту, большого количества текстовых данных). Работа фильтра заключается в чтении http-headers и изъятии данных о поддержке браузером клиента gzip-кодировки данных (параметр accept-encoding). Если данный тип кодировки поддерживается, то при возврате ответа клиенту его данные “подменятся” сжатыми, что уменьшает в результате размер отсылаемого ответа (Рисунок 1) Для перезаписи ответ “обертывается” в оболочку класса MyResponseWrapper, расширяющего класс HttpServletResponseWrapper. В MyResponseWrapper создана переменная, хранящая данные, которые будут в дальнейшем преобразовываться, а также перегружены основные методы суперкласса для обеспечения совместимости нового класса со всеми стандартными действиями, производимыми с суперклассом.
BigPageServlet выдает в качестве ответа клиенту страницу с большим числом текстовой информации.
Фильтр CompressionFilter запускается при запросе клиента к этому сервлету.
Код классов фильтров и часть дескриптора развертывания приведены в приложении А.

Рисунок 1
1.7.2 Example 4
Пример демонстрирует применение фильтра для ограничения доступа к определенным страницам (Рисунок 2 – демонстрирует главную страницу web-проекта). Если пользователь запрашивает “закрытую” страницу и он не проходил авторизацию, то фильтр Secure Filter сохраняет запрашиваемую страницу как параметр сессии, а пользователя отправляет на страницу регистрации (Рисунок 3). Если регистрация прошла успешно (в данном случаем достаточно просто ввести непустые значения в поля “Username” и “Password”), то сервлет LoginServlet, назначенный событию формы на странице регистрации, отправит пользователя на запрошенную до авторизации страницу, при помощи значения параметра SecureFilter. pageWanted, сохраненного в сессии фильтром SecureFilter (Рисунок 4). Также сервлет записывает в сессию атрибут “user”, помещая тем самым в нее объект класса User. Если при последующих запросах к “закрытым” страницам фильтр обнаруживает сохраненный в сессии объект класса User в виде атрибута под названием “user”, то он “пропускает” пользователя на запрошенную страницу.
При доступе к “открытым” страницам применяется фильтр UnsafeFilter, который задерживает запуск страниц на 5 секунд (Рисунок 5).
При любом запросе также применяется фильтр TimerFilter, который просчитывает время выполнения запроса. В дескрипторе развертывания цепь фильтров организована так, чтобы TimerFilter запускался самым первым, что позволяет ему просчитать полное время обработки запроса.
Код классов, текст web-страниц и содержимое дескриптора развертывания приведены в приложении А.

Рисунок 2

Рисунок 3

Рисунок 4

Рисунок 5
1.7.3 Example 3 и Example 2
Примеры демонстрируют назначение фильтров не только на обработку обычных запросов, но и применение их при использовании диспетчера запросов, а точнее его методов forward() и include() (jsp-директивы на страницах).
Было замечено, что при генерации ошибки на странице происходит переадресация (forward). Срабатывает в этом случае элемент <filter-mapping> - <dispatcher>FORWARD</dispatcher>, а не <dispatcher>ERROR</dispatcher>, что должно было бы происходить согласно спецификации Java Servlet Specification 2.4.
Пример Example 3 демонстрирует генерацию ошибки на странице и последующий запуск фильтра при переадресации на страницу ошибок. В дескрипторе развертывания указано, что фильтр должен срабатывать при всех запросах, а также при переадресации на другую страницу с помощью метода RequestDispatcher forward() или при генерации исключения, когда происходит автоматическое перенаправление запроса на страницу ошибок. Поэтому в результате запроса к странице /jsp/errorGenerate. jsp фильтр будет запущен два раза (Рисунок 6).
В примере Example 2 фильтр AddAttributesFilter добавляет к запросу атрибуты RedCounter и GreenCounter (в Example 3 добавляется только атрибут RedCounter), которые будут считать число «хитов» фильтров, т. е. количество их запусков в течение обработки одного запроса. RedFilter и GreenFilter извлекают эти атрибуты из запроса, инкрементируют счетчики «хитов» и помещают их обратно в запрос. Значения атрибутов извлекаются впоследствии на jsp-странице /jsp/useFilterCount. jsp с помощью стандартных тегов JSTL и неявных объектов.
При обращении к странице /jsp/useFilterCount. jsp будет запущен фильтр AddAttributesFilter, который установит счетчики, а также RedFilter и GreenFilter. В содержимое страницы динамически включается другая страница, поэтому RedFilter сработает еще один раз (Рисунок 7).
При обращении к странице /jsp/forwardDemo. jsp будет запущен фильтр AddAttributesFilter, который установит счетчики, а также RedFilter и GreenFilter. Количество “хитов” у GreenFilter будет два, т. к. была произведена переадресация на страницу /jsp/useFilterCount. jsp (Рисунок 8).
Код классов фильтров и часть дескриптора развертывания приведены в приложении А.

6

Рисунок 7

Рисунок 8
1.7.4 Example 1
Данный пример включает в себя систему из трех фильтров, которые организованы в цепь.
Обработка запроса происходит следующим образом. Запрашивается одна из страниц приложения. В ходе обработки запроса, до того как он достигнет целевого ресурса, запускаются фильтры.
Первый фильтр (FilterTimeAccess) проверяет попадает ли запрос во “время работы” web-приложения. Если запрос попал в промежуток времени, на который доступ закрыт всем, то выдается страница с информацией о том, в какое время доступ к web-приложению закрыт (Рисунок 9).
Если же “временной” контроль пройден, то следующий фильтр (FilterBlockIP) проверяет, находится ли IP-адрес клиента, запрашивающего ресурс, в “черном” списке. Если это так, то доступ клиенту к приложению перекрывается и в браузер выдается страница с исключением уровня сервера (Рисунок 10).
Если вышеуказанный контроль запроса пройден, то наступает последняя стадия проверки – запускается третий фильтр (FilterCheckLogin). Он запрашивает из сессии пользователя атрибут “loggedin”. Если его значение равно “yes”, то клиент авторизован и его запрос пропускается к целевому запрашиваемому ресурсу. Если такого атрибута еще нет, то он создается и устанавливается в значение “no”, в сессию также добавляется атрибут “user” со значением “guest” и запрос переадресовывается на страницу регистрации (Рисунок 11). Если значение атрибута равно “no”, то из запроса извлекаются параметры “login” и “password”. Эти значения получаются при отправке формы регистрации клиента. Идет проверка по списку клиентов, которым разрешен доступ – сверяется имя и пароль. Если найдено соответствие, то атрибут сессии “user” получает значение “login”, введенное пользователем при регистрации, а “loggedin” – “yes”. Клиенту в этом случае разрешается доступ к запрашиваемому ресурсу, например, к главной странице (Рисунок 12). Если соответствия в имени и пароле не найдено, то запрос перенаправляется снова на страницу регистрации.
В примере атрибут сессии “user” используется для создания приветствия на страницах. При нажатии кнопки “Logout” на страницах для зарегистрированного пользователя запускается сервлет Logout, который завершает сессию пользователя, удаляя ее (Рисунок 13).
Код классов фильтров и часть дескриптора развертывания приведены в приложении А.

Рисунок 9

Рисунок 10

Рисунок 11

Рисунок 12

Рисунок 13
Заключение
В результате проведенной работы была собрана и систематизирована информация о фильтрах в сервлетах и JSP, созданы экземпляры фильтров, как отображающие на примере их отдельные возможности, так и такие, которые могут быть применены в реальных web-приложениях.
В процессе работы было выявлено несколько несоответствий между теорией и практикой. Причины возникших результатов выяснить не удалось, хотя они не противоречат некоторым более общим фактам. Понятно, что при переходе на страницу ошибок происходит “переадресация” запроса. Поэтому и происходит запуск фильтра, описанного в дескрипторе развертывания с элементом <dispatcher>FORWARD</dispatcher>. По теории в более узком смысле должен был сработать элемент <dispatcher>ERROR</dispatcher>. Отдельное сочетание этих элементов не дало ожидаемых результатов.
Данные, предоставленные в работе, могут быть использованы в качестве краткого пособия по изучению технологии фильтров в теории и на примерах.
Тема фильтров в сервлетах и JSP может быть расширена, путем дополнительного рассмотрения таких технологий, как: слушатели (listeners) в web-приложениях, работа с базами данных, работа с различными типами файлов (графические изображения, текстовые документы, документы в формате PDF и т. п.), обеспечение безопасности в web-приложении (аутентификация и авторизация пользователей), проверка параметров html-формы и правильности написания почтового адреса (e-mail) и т. д. Т. к. исследования в работе по этим пунктам изначально не предполагались, то данные аспекты технологии фильтров рассмотрены не были.
Работа по более подробному изучению технологии фильтров в сервлетах и JSP может быть проведена детальней и подробней в качестве самостоятельных исследований либо как тема курсовой работы.
Список использованных источников
1. Перри. Java сервлеты и JSP: сборник рецептов. – М. КУДИЦ-ОБРАЗ, 2006. – 768 с.
2. , Java 2. Практическое руководство. – Мн.: УниверсалПресс, 2005. – 400 с.
3. Duane K. Fields, Mark A. Kolb, Shawn Bayern. Web Development with JSP, Second Edition. – Manning Publications Co. [Electronic resource] – http://www.
4. Marty Hall. More Servlets and JSP. – Prentice Hall PTR, 2001. – 752 c. [Electronic resource] – http://
5. Sing Li [Electronic resource] //Taming your Tomcat: Filtering tricks for Tomcat 5 – http:///developerworks/java/library/j-tomcat2/
6. Kyle Gabhart [Electronic resource] //J2EE pathfinder: Filtering with Java Servlets 2.4 – http:///developerworks/java/library/j-pj2ee10.html
7. Java EE Technology [Electronic resource] – http://java. /javaee/
8. Java EE API's & Docs [Electronic resource] – http://java. /javaee/reference/
9. Java Servlet 2.4 Specification [Electronic resource] – http://java. /j2ee/1.4/docs/index. html
10. Jayson Falkner [Electronic resource] //Two Servlet Filters Every Web Application Should Have – http://www. /pub/a/onjava/2003/11/19/filters. html
11. Kevin H. Le [Electronic resource] //Solving the logout problem properly and elegantly – http://www. /javaworld/jw/jw-0927-logout. html
12. Eric M. Burke. Java & XSTL. 2001. [Electronic resource] – http://hell. /Docs/oreilly/xml/jxslt/index. htm
13. Oracle Application Server Containers for J2EE Servlet Developer's Guide [Electronic resource] //Servlet filters and Event Listeners – http://docs. *****/docs/oracle/en/oas/9.0.4.0.0/web.904/b10321/filters. htm
Приложение А
Example 1
FilterCheckLogin. java
package filters;
import java. io.*;
import .*;
import java. util.*;
import java. text.*;
import javax. servlet.*;
import javax. servlet. http.*;
import javax. servlet. Filter;
import javax. servlet. FilterChain;
import javax. servlet. FilterConfig;
import javax. servlet. ServletContext;
import javax. servlet. ServletException;
import javax. servlet. ServletRequest;
import javax. servlet. ServletResponse;
public class FilterCheckLogin implements Filter {
private FilterConfig filterConfig = null;
private Hashtable<String, String> Users;
public FilterCheckLogin() {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
String loginUsers=null, passwordUsers=null;
HttpServletRequest req = (HttpServletRequest)request;
HttpSession session = req. getSession(true);
String loggedin = (String) session. getAttribute("loggedin");
String login = request. getParameter("login");
String password = request. getParameter("word");
if (loggedin == null){
session. setAttribute("user","guest");
session. setAttribute("loggedin","no");
RequestDispatcher dispatch = request. getRequestDispatcher("/login. jsp");
dispatch. forward(request, response);
return;
}
if (loggedin. equals("no")){
if (login!= null && password!= null){
login = login. trim();
password = password. trim();
passwordUsers = Users. get(login);
if(passwordUsers!= null && passwordUsers. equals(password)){
session. setAttribute("user",login);
session. setAttribute("loggedin","yes");
chain. doFilter(request, response);
return;
} else {
session. setAttribute("user","guest");
session. setAttribute("loggedin","no");
RequestDispatcher dispatch = request. getRequestDispatcher("/login. jsp");
dispatch. forward(request, response);
return;
}
} else {
session. setAttribute("user","guest");
session. setAttribute("loggedin","no");
RequestDispatcher dispatch = request. getRequestDispatcher("/login. jsp");
dispatch. forward(request, response);
return;
}
}
if (loggedin. equals("yes")){
chain. doFilter(request, response);
return;
} else {
session. setAttribute("user","guest");
session. setAttribute("loggedin","no");
RequestDispatcher dispatch = request. getRequestDispatcher("/login. jsp");
dispatch. forward(request, response);
return;
}
}
public FilterConfig getFilterConfig() {
return (this. filterConfig);
}
public void setFilterConfig(FilterConfig filterConfig) {
this. filterConfig = filterConfig;
}
public void destroy() {}
public void init(FilterConfig filterConfig) {
this. filterConfig = filterConfig;
Users = new Hashtable<String, String>();
String[] us = {"Mike","Alice","Juddy","Jack"};
String[] pasw = {"1478","1234","ab12","qwerty"};
int n = 4;
for(int i=0; i<n; ++i){
Users. put(us[i],pasw[i]);
}
}
}
FilterTimeAccess. java
package filters;
import java. io.*;
import .*;
import java. util.*;
import java. text.*;
import javax. servlet.*;
import javax. servlet. http.*;
import javax. servlet. Filter;
import javax. servlet. FilterChain;
import javax. servlet. FilterConfig;
import javax. servlet. ServletContext;
import javax. servlet. ServletException;
import javax. servlet. ServletRequest;
import javax. servlet. ServletResponse;
public class FilterTimeAccess implements Filter {
private FilterConfig config = null;
private ServletContext context;
private int startTime, endTime;
private DateFormat formatter;
public FilterTimeAccess() {}
private void blockingResponse(ServletRequest request,
ServletResponse response, GregorianCalendar calendar)
throws IOException, ServletException{
HttpServletRequest req = (HttpServletRequest)request;
context. log("WARNING: " +
req. getRemoteHost() +
" accessed " +
req. getRequestURL() +
" on " +
formatter. format(calendar. getTime()));
HttpServletResponse res = (HttpServletResponse)response;
res. setContentType("text/html");
PrintWriter out = res. getWriter();
String docType = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0"+
"Translational//EN\">\n";
out. println(docType+
"<HTML>\n" +
"<HEAD><TITLE>Access Prohibited</TITLE></HEAD>\n" +
"<BODY BGCOLOR=\"WHITE\">\n" +
"<H1>Access Prohibited</H1>\n" +
"Sorry, access from " + startTime + ":00 till " +
endTime +
":00 is not allowed.\n" +
"</BODY></HTML>");
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
GregorianCalendar calendar = new GregorianCalendar();
int currentTime = calendar. get(calendar. HOUR_OF_DAY);
if(isUnusualTime(currentTime, startTime, endTime)){
blockingResponse(request, response, calendar);
}else{
chain. doFilter(request, response);
}
}
public void setFilterConfig(FilterConfig filterConfig) {
this. config = filterConfig;
}
public void destroy() {}
public void init(FilterConfig filterConfig) {
this. config = filterConfig;
if (config!= null) {
context=config. getServletContext(); formatter=DateFormat. getDateTimeInstance(DateFormat. MEDIUM, DateFormat. MEDIUM);
try{
startTime=Integer. parseInt(config. getInitParameter("startTime"));
endTime=Integer. parseInt(config. getInitParameter("endTime"));
}catch(NumberFormatException nfe){
//Default: access at or after 10 p. m. but before 6 p. m.
//is considered unusual.
startTime=22;
endTime=6;
}
}
}
private boolean isUnusualTime(int currentTime, int startTime, int endTime){
if(startTime < endTime){
return((currentTime >= startTime) && (currentTime < endTime));
}else{
return(!isUnusualTime(currentTime, endTime, startTime));
}
}
}
FilterBlockIP. java
package filters;
import java. io.*;
import .*;
import java. util.*;
import java. text.*;
import javax. servlet.*;
import javax. servlet. http.*;
import javax. servlet. Filter;
import javax. servlet. FilterChain;
import javax. servlet. FilterConfig;
import javax. servlet. ServletContext;
import javax. servlet. ServletException;
import javax. servlet. ServletRequest;
import javax. servlet. ServletResponse;
public class FilterBlockIP implements Filter {
private FilterConfig filterConfig = null;
private HashSet IPTable;
public FilterBlockIP() {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
String ip = request. getRemoteAddr();
HttpServletResponse newResponse = null;
if (response instanceof HttpServletResponse)
newResponse = (HttpServletResponse) response;
StringTokenizer toke = new StringTokenizer(ip,".");
int dots = 0;
String byte1 = "";
String byte2 = "";
String client = "";
while(toke. hasMoreTokens()){
++dots;
if (dots == 1) {
byte1 = toke. nextToken();
} else {
byte2 = toke. nextToken();
break;
}
}
client=byte1+"."+byte2;
boolean isEnemyIP = false;
if (IPTable. contains(client)){
newResponse. sendError(HttpServletResponse. SC_FORBIDDEN,"Access forbidden! IP: "+ip);
} else {
chain. doFilter(request, response);
}
}
public void destroy() {}
public void init(FilterConfig filterConfig) {
this. filterConfig = filterConfig;
IPTable = new HashSet();
String blockingIP = filterConfig. getInitParameter("block_ip");
// Default token set: white space.
StringTokenizer tokens = new StringTokenizer(blockingIP," ");
while(tokens. hasMoreTokens()) {
String block = tokens. nextToken();
IPTable. add(block);
}
}
}
web. xml
…
<filter>
<filter-name>BlockIP</filter-name>
<filter-class>filters. FilterBlockIP</filter-class>
<init-param>
<param-name>block_ip</param-name>
<param-value>192.</param-value>
</init-param>
</filter>
<filter>
<filter-name>CheckLogin</filter-name>
<filter-class>filters. FilterCheckLogin</filter-class>
</filter>
<filter>
<filter-name>TimeAccess</filter-name>
<filter-class>filters. FilterTimeAccess</filter-class>
<init-param>
<param-name>startTime</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>endTime</param-name>
<param-value>6</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>TimeAccess</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>BlockIP</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CheckLogin</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>Links</servlet-name>
<servlet-class>servlets. ShowLinks</servlet-class>
</servlet>
<servlet>
<servlet-name>Logout</servlet-name>
<servlet-class>servlets. Logout</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Links</servlet-name>
<url-pattern>/Links</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Logout</servlet-name>
<url-pattern>/Logout</url-pattern>
</servlet-mapping>
…
Example 2
GreenFilter. java
package filters;
import java. io.*;
import .*;
import java. util.*;
import java. text.*;
import javax. servlet.*;
import javax. servlet. http.*;
import javax. servlet. Filter;
import javax. servlet. FilterChain;
import javax. servlet. FilterConfig;
import javax. servlet. ServletContext;
import javax. servlet. ServletException;
import javax. servlet. ServletRequest;
import javax. servlet. ServletResponse;
public class GreenFilter implements Filter {
public static final String COUNTER_ATTRIB = "GreenCounter";
private FilterConfig filterConfig = null;
public GreenFilter() {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
filterConfig. getServletContext().log("Inside GreenFilter");
Integer curCount = (Integer) request. getAttribute(COUNTER_ATTRIB);
if (curCount!= null)
request. setAttribute(COUNTER_ATTRIB, new Integer(curCount. intValue() + 1));
else
request. setAttribute(COUNTER_ATTRIB, new Integer(1));
chain. doFilter(request, response);
}
public void destroy() {}
public void init(FilterConfig filterConfig) {
this. filterConfig = filterConfig;
}
}
RedFilter. java
package filters;
import java. io.*;
import .*;
import java. util.*;
import java. text.*;
import javax. servlet.*;
import javax. servlet. http.*;
import javax. servlet. Filter;
import javax. servlet. FilterChain;
import javax. servlet. FilterConfig;
import javax. servlet. ServletContext;
import javax. servlet. ServletException;
import javax. servlet. ServletRequest;
import javax. servlet. ServletResponse;
public class RedFilter implements Filter {
public static final String COUNTER_ATTRIB = "RedCounter";
private FilterConfig filterConfig = null;
public RedFilter() {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
filterConfig. getServletContext().log("Inside RedFilter");
Integer curCount = (Integer) request. getAttribute(COUNTER_ATTRIB);
if (curCount!= null)
request. setAttribute(COUNTER_ATTRIB, new Integer(curCount. intValue() + 1));
else
request. setAttribute(COUNTER_ATTRIB, new Integer(1));
chain. doFilter(request, response);
}
public void destroy() {}
public void init(FilterConfig filterConfig) {
this. filterConfig = filterConfig;
}
}
AddAttributesFilter. java
package filters;
import java. io.*;
import .*;
import java. util.*;
import java. text.*;
import javax. servlet.*;
import javax. servlet. http.*;
import javax. servlet. Filter;
import javax. servlet. FilterChain;
import javax. servlet. FilterConfig;
import javax. servlet. ServletContext;
import javax. servlet. ServletException;
import javax. servlet. ServletRequest;
import javax. servlet. ServletResponse;
public class AddAttributesFilter implements Filter {
public static final String RED_COUNTER_ATTRIB = "RedCounter";
public static final String GREEN_COUNTER_ATTRIB = "GreenCounter";
private FilterConfig filterConfig = null;
public AddAttributesFilter() {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
Integer curCount = (Integer) request. getAttribute(RED_COUNTER_ATTRIB);
if (curCount == null)
request. setAttribute(RED_COUNTER_ATTRIB, new Integer(0));
curCount = (Integer) request. getAttribute(GREEN_COUNTER_ATTRIB);
if (curCount == null)
request. setAttribute(GREEN_COUNTER_ATTRIB, new Integer(0));
filterConfig. getServletContext().log("Inside AddAttributeFilter");
chain. doFilter(request, response);
}
public void destroy() {}
public void init(FilterConfig filterConfig) {
this. filterConfig = filterConfig;
}
}
web. xml
…
<filter>
<filter-name>AddAttributes</filter-name>
<filter-class>filters. AddAttributesFilter</filter-class>
</filter>
<filter>
<filter-name>GreenFilter</filter-name>
<filter-class>filters. GreenFilter</filter-class>
</filter>
<filter>
<filter-name>RedFilter</filter-name>
<filter-class>filters. RedFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AddAttributes</filter-name>
<url-pattern>/jsp/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>RedFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>GreenFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
…
Example 3
AddAttributesFilter. java
package filters;
import java. io.*;
import .*;
import java. util.*;
import java. text.*;
import javax. servlet.*;
import javax. servlet. http.*;
import javax. servlet. Filter;
import javax. servlet. FilterChain;
import javax. servlet. FilterConfig;
import javax. servlet. ServletContext;
import javax. servlet. ServletException;
import javax. servlet. ServletRequest;
import javax. servlet. ServletResponse;
public class AddAttributesFilter implements Filter {
public static final String RED_COUNTER_ATTRIB = "RedCounter";
public static final String GREEN_COUNTER_ATTRIB = "GreenCounter";
private FilterConfig filterConfig = null;
public AddAttributesFilter() {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
Integer curCount = (Integer) request. getAttribute(RED_COUNTER_ATTRIB);
if (curCount == null)
request. setAttribute(RED_COUNTER_ATTRIB, new Integer(0));
curCount = (Integer) request. getAttribute(GREEN_COUNTER_ATTRIB);
if (curCount == null)
request. setAttribute(GREEN_COUNTER_ATTRIB, new Integer(0));
filterConfig. getServletContext().log("Inside AddAttributeFilter");
chain. doFilter(request, response);
}
public void destroy() {}
public void init(FilterConfig filterConfig) {
this. filterConfig = filterConfig;
}
}
RedFilter. java
package filters;
import java. io.*;
import .*;
import java. util.*;
import java. text.*;
import javax. servlet.*;
import javax. servlet. http.*;
import javax. servlet. Filter;
import javax. servlet. FilterChain;
import javax. servlet. FilterConfig;
import javax. servlet. ServletContext;
import javax. servlet. ServletException;
import javax. servlet. ServletRequest;
import javax. servlet. ServletResponse;
public class RedFilter implements Filter {
public static final String COUNTER_ATTRIB = "RedCounter";
private FilterConfig filterConfig = null;
public RedFilter() {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
filterConfig. getServletContext().log("Inside RedFilter");
Integer curCount = (Integer) request. getAttribute(COUNTER_ATTRIB);
if (curCount!= null)
request. setAttribute(COUNTER_ATTRIB, new Integer(curCount. intValue() + 1));
else
request. setAttribute(COUNTER_ATTRIB, new Integer(1));
chain. doFilter(request, response);
}
public void destroy() {}
public void init(FilterConfig filterConfig) {
this. filterConfig = filterConfig;
}
}
web. xml
...
<filter>
<filter-name>AddAttributes</filter-name>
<filter-class>filters. AddAttributesFilter</filter-class>
</filter>
<filter>
<filter-name>RedFilter</filter-name>
<filter-class>filters. RedFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AddAttributes</filter-name>
<url-pattern>/jsp/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>RedFilter</filter-name>
<url-pattern>/jsp/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>jsp/errorGenerate. jsp</welcome-file>
</welcome-file-list>
</web-app>
Example 4
SecureFilter. java
package filters;
import javax. servlet.*;
import javax. servlet. http.*;
import java. io. IOException;
import login. User;
public class SecureFilter implements Filter {
private FilterConfig filterConfig = null;
public SecureFilter() {}
public void init(FilterConfig filterConfig) {
this. filterConfig = filterConfig;
}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
boolean authorized = false;
if (request instanceof HttpServletRequest) {
HttpSession session = ((HttpServletRequest)request).getSession(true);
if (session!= null) {
User user = (User) session. getAttribute("user");
if (user!= null)
authorized = true;
}
}
if (authorized) {
chain. doFilter(request, response);
return;
} else if (filterConfig!= null) {
String login_page = filterConfig. getInitParameter("login_page");
if (login_page!= null && !"".equals(login_page)) {
filterConfig. getServletContext().getRequestDispatcher(login_page).forward(request, response);
rememberPage((HttpServletRequest)request);
return;
}
}
throw new ServletException("Unauthorized access, unable to forward to login page");
}
/** Set the page page the user wanted to go to in the session. */
private void rememberPage(HttpServletRequest request) {
StringBuffer pageWanted = new StringBuffer(request. getServletPath());
String pathInfo = request. getPathInfo();
if (pathInfo!= null && !"".equals(pathInfo))
pageWanted. append("/" + pathInfo);
String queryString = request. getQueryString();
if (queryString!= null && !"".equals(queryString))
pageWanted. append("?" + queryString);
HttpSession session = request. getSession();
session. setAttribute("SecureFilter. pageWanted", pageWanted. toString());
}
public void destroy() {}
}
TimerFilter. java
package filters;
import java. io. IOException;
import javax. servlet. Filter;
import javax. servlet. FilterChain;
import javax. servlet. FilterConfig;
import javax. servlet. ServletException;
import javax. servlet. ServletRequest;
import javax. servlet. ServletResponse;
public class TimerFilter implements Filter {
public TimerFilter() {}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
long startTime = System. currentTimeMillis();
chain. doFilter(request, response);
long stopTime = System. currentTimeMillis();
System. out. println("Time to execute request: " + (stopTime - startTime) +
" milliseconds");
}
public void destroy() {}
public void init(FilterConfig filterConfig) throws ServletException {}
}
UnsafeFilter. java
package filters;
import javax. servlet.*;
import java. io. IOException;
public class UnsafeFilter implements Filter {
private int hitCount = 0;
public UnsafeFilter() {}
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
hitCount++;
try {
Thread. sleep(5000);
} catch (InterruptedException e) { }
chain. doFilter(request, response);
System. out. println("This filter has been hit = " + hitCount + " times");
}
public void init(FilterConfig filterConfig) {}
public void destroy() {}
}
web. xml
…
<filter>
<filter-name>SecureFilter</filter-name>
<filter-class>filters. SecureFilter</filter-class>
<init-param>
<param-name>login_page</param-name>
<param-value>/login. html</param-value>
</init-param>
</filter>
<filter>
<filter-name>UnsafeFilter</filter-name>
<filter-class>filters. UnsafeFilter</filter-class>
</filter>
<filter>
<filter-name>Timer</filter-name>
<filter-class>filters. TimerFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Timer</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>UnsafeFilter</filter-name>
<url-pattern>/unsafe. html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SecureFilter</filter-name>
<url-pattern>/secure. html</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>login. LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
…
Example 5
CompressionFilter. java
package filters;
import java. io.*;
import .*;
import java. util.*;
import java. text.*;
import java. util. zip. GZIPOutputStream;
import javax. servlet.*;
import javax. servlet. http.*;
import javax. servlet. Filter;
import javax. servlet. FilterChain;
import javax. servlet. FilterConfig;
import javax. servlet. ServletContext;
import javax. servlet. ServletException;
import javax. servlet. ServletRequest;
import javax. servlet. ServletResponse;
import utilclasses. MyResponseWrapper;
public class CompressionFilter implements Filter {
private FilterConfig filterConfig;
public CompressionFilter() {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
HttpServletRequest rq = (HttpServletRequest)request;
HttpServletResponse rs = (HttpServletResponse)response;
if (!isGzipSupported(rq)){
chain. doFilter(request, response);
} else {
rs. setHeader("Content-Encoding","gzip");
MyResponseWrapper responseWrapped = new MyResponseWrapper(rs);
chain. doFilter(rq, responseWrapped);
char [] responseChars = responseWrapped. toCharArray();
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
GZIPOutputStream zipOut = new GZIPOutputStream(byteStream);
OutputStreamWriter tempOut = new OutputStreamWriter(zipOut);
tempOut. write(responseChars);
tempOut. close();
rs. setContentLength(byteStream. size());
OutputStream realOut = rs. getOutputStream();
byteStream. writeTo(realOut);
}
}
private boolean isGzipSupported(HttpServletRequest request){
String browserEncode = request. getHeader("Accept-Encoding");
return ((browserEncode!= null) && (browserEncode. indexOf("gzip") != -1));
}
public FilterConfig getFilterConfig() {
return (this. filterConfig);
}
public void destroy() {}
public void init(FilterConfig filterConfig) {
this. filterConfig = filterConfig;
}
}
MyResponseWrapper. java
package utilclasses;
import java. io. CharArrayWriter;
import java. io. PrintWriter;
import javax. servlet. http. HttpServletResponse;
import javax. servlet. http. HttpServletResponseWrapper;
public class MyResponseWrapper extends HttpServletResponseWrapper {
private CharArrayWriter charWriter;
public MyResponseWrapper(HttpServletResponse response) {
super(response);
charWriter = new CharArrayWriter();
}
public PrintWriter getWriter(){
return (new PrintWriter(charWriter));
}
public String toString() {
return (charWriter. toString());
}
public char[] toCharArray(){
return (charWriter. toCharArray());
}
}
web. xml
…
<filter>
<filter-name>CompressionFilter</filter-name>
<filter-class>pressionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CompressionFilter</filter-name>
<servlet-name>BigPageServlet</servlet-name>
</filter-mapping>
<servlet>
<servlet-name>BigPageServlet</servlet-name>
<servlet-class>servlets. BigPageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BigPageServlet</servlet-name>
<url-pattern>/BigPageServlet</url-pattern>
</servlet-mapping>
…


