JSP - фильтры

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

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

  • Для управления ответами сервера перед их отправкой клиенту.

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

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

public 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-installation-directory>/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; следующий пример изменит порядок -

<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>