Сервлеты - Написание фильтров

Фильтры сервлетов - это классы Java, которые можно использовать в программировании сервлетов для следующих целей:

  • Для перехвата запросов от клиента до того, как он обратится к ресурсу в серверной части.

  • Чтобы управлять ответами с сервера, прежде чем они будут отправлены обратно клиенту.

Спецификации предлагают различные типы фильтров -

  • Фильтры аутентификации.
  • Фильтры сжатия данных.
  • Фильтры шифрования.
  • Фильтры, запускающие события доступа к ресурсам.
  • Фильтры преобразования изображений.
  • Фильтры регистрации и аудита.
  • Цепные фильтры MIME-типа.
  • Токенизирующие фильтры.
  • 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

public 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, чтобы записать вышеуказанный журнал в отдельный файл.

Использование нескольких фильтров

Ваше веб-приложение может определять несколько различных фильтров с определенной целью. Считайте, вы определяете два фильтра 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 к любому сервлету, но в следующем примере порядок изменится на противоположный:

<filter-mapping>
   <filter-name>AuthenFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

<filter-mapping>
   <filter-name>LogFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>