Учебники

JSP — Фильтры

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

  • Перехватывать запросы от клиента, прежде чем они получат доступ к ресурсу на стороне сервера.

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

Перехватывать запросы от клиента, прежде чем они получат доступ к ресурсу на стороне сервера.

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

Существуют различные типы фильтров, предлагаемые спецификациями —

  • Фильтры аутентификации
  • Фильтры сжатия данных
  • Фильтры шифрования
  • Фильтры, запускающие события доступа к ресурсам
  • Фильтры преобразования изображений
  • Фильтры журналирования и аудита
  • Цепные фильтры MIME-TYPE
  • Фильтры токенизации
  • Фильтры XSL / T, которые преобразуют содержимое XML

Фильтры развертываются в файле дескриптора развертывания web.xml и затем сопоставляются с именами сервлетов, JSP или шаблонами URL в дескрипторе развертывания вашего приложения. Файл дескриптора развертывания web.xml находится в каталоге <Tomcat-installation-directory> \ conf .

Когда контейнер JSP запускает ваше веб-приложение, он создает экземпляр каждого фильтра, который вы объявили в дескрипторе развертывания. Фильтры выполняются в том порядке, в котором они объявлены в дескрипторе развертывания.

Методы фильтрации сервлетов

Фильтр — это просто класс Java, который реализует интерфейс javax.servlet.Filter . Интерфейс javax.servlet.Filter определяет три метода:

S.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 ()

Этот метод вызывается веб-контейнером, чтобы указать фильтру, что он выводится из эксплуатации.

Пример фильтра JSP

В следующем примере показано, как распечатать IP-адрес клиента и текущую дату и время при каждом обращении к любому файлу JSP. Этот пример даст вам общее представление о фильтре JSP, но вы можете написать более сложные приложения-фильтры, используя ту же концепцию —

// 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 обычным способом и поместите файл LogFilter.class в <каталог-установки Tomcat> / webapps / ROOT / WEB-INF / classes .

Сопоставление фильтров JSP в Web.xml

Фильтры определяются и затем сопоставляются с именем файла URL или JSP, почти так же, как определяется сервлет, а затем сопоставляются с шаблоном URL в файле web.xml . Создайте следующую запись для тега фильтра в файле дескриптора развертывания 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>

Вышеупомянутый фильтр будет применяться ко всем сервлетам и JSP, потому что мы указали / * в нашей конфигурации. Вы можете указать конкретный сервлет или путь JSP, если хотите применить фильтр только к нескольким сервлетам или JSP.

Теперь попробуйте вызвать любой сервлет или JSP, и вы увидите сгенерированный журнал в журнале вашего веб-сервера. Вы можете использовать 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 определяет порядок, в котором веб-контейнер применяет фильтр к сервлету или JSP. Чтобы изменить порядок фильтра, нужно просто изменить элементы сопоставления фильтра в файле web.xml .

Например, в приведенном выше примере сначала будет применен LogFilter, а затем AuthenFilter к любому сервлету или JSP; следующий пример обратный порядок —