Автор оригинала: Pankaj Kumar.
Фильтр сервлета Javax используется для перехвата запроса клиента и выполнения некоторой предварительной обработки. Он также может перехватывать ответ и выполнять последующую обработку перед отправкой клиенту в веб-приложении. Это четвертая статья в серии учебников по веб-приложениям, возможно, вам также захочется ознакомиться с более ранними статьями.
- Веб-приложение Java
- Учебник по сервлетам Java
- Управление сеансами Сервлетов
Фильтр Сервлетов
В этой статье мы узнаем о фильтре сервлетов в Java. Мы рассмотрим различные способы использования фильтра сервлетов, как мы можем создать фильтр и изучить его использование с помощью простого веб-приложения.
- Почему у нас есть фильтр сервлетов?
- Интерфейс фильтра сервлетов
- Аннотация веб-фильтра сервлета
- Конфигурация фильтра сервлетов в web.xml
- Пример фильтра сервлета для регистрации и проверки сеанса
Почему у нас есть фильтр сервлетов?
В предыдущей статье мы узнали, как мы можем управлять сеансом в веб-приложении, и если мы хотим убедиться, что ресурс доступен только тогда, когда сеанс пользователя действителен, мы можем добиться этого с помощью атрибутов сеанса сервлета. Подход прост, но если у нас будет много сервлетов и jsp, то его будет трудно поддерживать из-за избыточного кода. Если мы захотим изменить имя атрибута в будущем, нам придется изменить все места, где у нас есть аутентификация сеанса.
Вот почему у нас есть фильтр сервлетов. Фильтры сервлетов являются подключаемыми компонентами java, которые мы можем использовать для перехвата и обработки запросов до их отправки сервлетам и ответа после завершения кода сервлета и до того, как контейнер отправит ответ обратно клиенту.
Некоторые общие задачи, которые мы можем выполнять с помощью фильтров сервлетов, следующие:
- Протоколирование параметров запроса в файлы журналов.
- Аутентификация и авторизация запроса ресурсов.
- Форматирование тела или заголовка запроса перед отправкой его сервлету.
- Сжатие данных ответа, отправленных клиенту.
- Измените ответ, добавив некоторые файлы cookie, информацию о заголовке и т.д.
Как я упоминал ранее, фильтры сервлетов подключаются и настраиваются в дескрипторе развертывания (web.xml) файл. Сервлеты и фильтры не знают друг о друге, и мы можем добавить или удалить фильтр сервлета, просто отредактировав web.xml.
У нас может быть несколько фильтров для одного ресурса, и мы можем создать цепочку фильтров для одного ресурса в web.xml. Мы можем создать фильтр сервлетов, реализовав
javax.servlet.Фильтр
Интерфейс.Интерфейс фильтра сервлетов
Интерфейс фильтра сервлетов похож на интерфейс сервлетов, и нам нужно реализовать его, чтобы создать наш собственный фильтр сервлетов. Интерфейс фильтра сервлетов содержит методы жизненного цикла фильтра и управляется контейнером сервлетов.
Методы жизненного цикла интерфейса фильтра сервлетов являются:
- void init(FilterConfig paramFilterConfig) – Когда контейнер инициализирует фильтр, вызывается этот метод. Этот метод вызывается только один раз в жизненном цикле фильтра, и мы должны инициализировать любые ресурсы в этом методе. FilterConfig используется контейнером для предоставления параметров инициализации и объекта контекста сервлета Фильтру. Мы можем создать исключение ServletException в этом методе.
- doFilter(ServletRequest paramServletRequest, ServletResponse paramServletResponse, FilterChain paramFilterChain) – Это метод, вызываемый контейнером каждый раз, когда он должен применить фильтр к ресурсу. Контейнер предоставляет ссылки на объекты запроса и ответа для фильтрации в качестве аргумента. Цепочка фильтров используется для вызова следующего фильтра в цепочке. Это отличный пример Схемы цепочки ответственности .
- void destroy() – Когда контейнер выгружает экземпляр фильтра, он вызывает метод destroy (). Это метод, с помощью которого мы можем закрыть любые ресурсы, открытые фильтром. Этот метод вызывается только один раз за время существования фильтра.
Аннотация веб-фильтра сервлета
javax.сервлет.аннотация.WebFilter
был представлен в Servlet 3.0, и мы можем использовать эту аннотацию для объявления фильтра сервлета. Мы можем использовать эту аннотацию для определения параметров инициализации, имени и описания фильтра, сервлета, шаблонов URL-адресов и типов диспетчеров для применения фильтра. Если вы часто вносите изменения в конфигурации фильтров, лучше использовать web.xml потому что для этого не потребуется перекомпилировать класс фильтра.Прочитайте : Учебник по аннотациям Java
Конфигурация фильтра сервлетов в web.xml
Мы можем объявить фильтр сервлета в web.xml как показано ниже.
Мы можем сопоставить фильтр с классами сервлетов или шаблонами URL, как показано ниже.
Примечание. При создании цепочки фильтров для сервлета контейнер сначала обрабатывает шаблоны URL-адресов, а затем имена сервлетов, поэтому, если вам нужно убедиться, что фильтры выполняются в определенном порядке, уделите особое внимание при определении сопоставления фильтров.
Фильтры сервлетов обычно используются для запросов клиентов, но иногда мы хотим применить фильтры с RequestDispatcher также мы можем использовать элемент диспетчера в этом случае, возможными значениями являются ЗАПРОС, ПЕРЕСЫЛКА, ВКЛЮЧЕНИЕ, ОШИБКА и АСИНХРОННОСТЬ. Если диспетчер не определен, то он применяется только к запросам клиентов.
Пример фильтра сервлета для регистрации и проверки сеанса
В нашем примере фильтр сервлетов мы создадим фильтры для регистрации файлов cookie и параметров запросов и проверки сеанса для всех ресурсов , кроме статических HTMLs и LoginServlet, потому что у него не будет сеанса.
Мы создадим динамический веб-проект Пример фильтра сервлетов , структура проекта которого будет выглядеть так, как показано на рисунке ниже.
login.html это точка входа в наше приложение, где пользователь предоставит идентификатор входа и пароль для аутентификации.
login.html код:
LoginServlet используется для аутентификации запроса клиента на вход в систему.
Когда клиент проходит проверку подлинности, он перенаправляется в LoginSuccess.jsp
Код LoginSuccess.jsp:
Обратите внимание, что в приведенном выше JSP отсутствует логика проверки сеанса. Он содержит ссылку на другую страницу JSP, страницу оформления заказа.jsp.
Страница оформления заказа.код jsp:
LogoutServlet вызывается, когда клиент нажимает кнопку выхода из системы на любой из страниц JSP.
Теперь мы создадим классы фильтров сервлетов регистрации и аутентификации.
Обратите внимание, что мы не проверяем подлинность какой-либо HTML-страницы или учетной записи. Теперь мы настроим отображение этих фильтров в web.xml файл.
Теперь, когда мы запустим наше приложение, мы получим страницы ответов, как показано на изображениях ниже.
Если вы не вошли в систему и попытаетесь получить доступ к какой-либо странице JSP, вы будете перенаправлены на страницу входа в систему.
В файле журнала сервера вы можете видеть журналы, записанные фильтрами сервлетов, а также сервлетами.
Это все для фильтра сервлетов в java. Это одна из важных функций веб-приложения Java EE, и мы должны использовать ее для общих задач, выполняемых различными сервлетами. В будущих сообщениях мы рассмотрим прослушиватели сервлетов и файлы cookie.
Обновление: После получения большого количества запросов на загружаемый проект я прикрепил его к сообщению, загрузите его по ссылке ниже.
Ознакомьтесь со следующей статьей из серии о Прослушивателе сервлетов .
Обновление
Struts 2 использует фильтр сервлетов для перехвата клиентских запросов и пересылки их в соответствующие классы действий, которые называются перехватчиками Struts 2. Проверьте Учебник для начинающих Struts 2 .