Фильтры сервлетов — это классы Java, которые можно использовать в программировании сервлетов для следующих целей:
-
Перехватывать запросы от клиента, прежде чем они получат доступ к ресурсу на стороне сервера.
-
Чтобы манипулировать ответами от сервера, прежде чем они будут отправлены обратно клиенту.
Перехватывать запросы от клиента, прежде чем они получат доступ к ресурсу на стороне сервера.
Чтобы манипулировать ответами от сервера, прежде чем они будут отправлены обратно клиенту.
Существуют различные типы фильтров, предлагаемые спецификациями —
- Фильтры аутентификации.
- Фильтры сжатия данных.
- Фильтры шифрования.
- Фильтры, запускающие события доступа к ресурсам.
- Фильтры преобразования изображений.
- Фильтры журналирования и аудита.
- Цепные фильтры MIME-TYPE.
- Фильтры токенизации.
- Фильтры XSL / T, которые преобразуют содержимое XML.
Фильтры развертываются в файле дескриптора развертывания web.xml и затем сопоставляются с именами сервлетов или шаблонами URL в дескрипторе развертывания вашего приложения.
Когда веб-контейнер запускает ваше веб-приложение, он создает экземпляр каждого фильтра, который вы объявили в дескрипторе развертывания. Фильтры выполняются в том порядке, в котором они объявлены в дескрипторе развертывания.
Методы фильтрации сервлетов
Фильтр — это просто класс Java, который реализует интерфейс javax.servlet.Filter. Интерфейс javax.servlet.Filter определяет три метода:
Sr.No. | Метод и описание |
---|---|
1 |
public void doFilter (ServletRequest, ServletResponse, FilterChain) Этот метод вызывается контейнером каждый раз, когда пара запрос / ответ проходит через цепочку из-за клиентского запроса на ресурс в конце цепочки. |
2 |
public void init (FilterConfig filterConfig) Этот метод вызывается веб-контейнером, чтобы указать фильтру, что он помещается в службу. |
3 |
публичный void destroy () Этот метод вызывается веб-контейнером, чтобы указать фильтру, что он выводится из эксплуатации. |
public void doFilter (ServletRequest, ServletResponse, FilterChain)
Этот метод вызывается контейнером каждый раз, когда пара запрос / ответ проходит через цепочку из-за клиентского запроса на ресурс в конце цепочки.
public void init (FilterConfig filterConfig)
Этот метод вызывается веб-контейнером, чтобы указать фильтру, что он помещается в службу.
публичный void destroy ()
Этот метод вызывается веб-контейнером, чтобы указать фильтру, что он выводится из эксплуатации.
Фильтр сервлетов — пример
Ниже приведен пример фильтра сервлетов, который распечатывает IP-адрес клиента и текущую дату. Этот пример даст вам общее представление о Servlet Filter, но вы можете написать более сложные приложения-фильтры, используя ту же концепцию —
// Import required java libraries import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.util.*; // Implements Filter class public class LogFilter implements Filter { public void init(FilterConfig config) throws ServletException { // Get init parameter String testParam = config.getInitParameter("test-param"); //Print the init parameter System.out.println("Test Param: " + testParam); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException { // Get the IP address of client machine. String ipAddress = request.getRemoteAddr(); // Log the IP address and current timestamp. System.out.println("IP "+ ipAddress + ", Time " + new Date().toString()); // Pass request back down the filter chain chain.doFilter(request,response); } public void destroy( ) { /* Called before the Filter instance is removed from service by the web container*/ } }
Скомпилируйте LogFilter.java обычным способом и поместите ваш файл классов в <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes
Отображение фильтра сервлетов в Web.xml
Фильтры определяются и затем сопоставляются с URL-адресом или сервлетом, почти так же, как определяется сервлет, а затем сопоставляется с шаблоном URL-адреса. Создайте следующую запись для тега фильтра в файле дескриптора развертывания web.xml
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Paramter</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Вышеупомянутый фильтр будет применяться ко всем сервлетам, потому что мы указали / * в нашей конфигурации. Вы можете указать конкретный путь сервлета, если хотите применить фильтр только к нескольким сервлетам.
Теперь попробуйте вызвать любой сервлет обычным способом, и вы увидите сгенерированный журнал в журнале вашего веб-сервера. Вы можете использовать Log4J logger для входа выше журнала в отдельном файле.
Использование нескольких фильтров
Ваше веб-приложение может определять несколько разных фильтров с определенной целью. Учтите, вы определяете два фильтра AuthenFilter и LogFilter . Остальная часть процесса останется такой же, как описано выше, за исключением того, что вам нужно создать другое отображение, как указано ниже —
<filter> <filter-name>LogFilter</filter-name> <filter-class>LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Paramter</param-value> </init-param> </filter> <filter> <filter-name>AuthenFilter</filter-name> <filter-class>AuthenFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Paramter</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
Порядок применения фильтров
Порядок элементов сопоставления фильтра в web.xml определяет порядок, в котором веб-контейнер применяет фильтр к сервлету. Чтобы изменить порядок фильтра, нужно просто изменить элементы сопоставления фильтра в файле web.xml.
Например, в приведенном выше примере сначала будет применен LogFilter, а затем будет применен AuthenFilter к любому сервлету, но в следующем примере будет изменен порядок: