Учебники

Сервлеты — Письменные фильтры

Фильтры сервлетов — это классы 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 к любому сервлету, но в следующем примере будет изменен порядок: