Serwlety - filtry piszące

Filtry serwletów to klasy Java, których można używać w programowaniu serwletów do następujących celów:

  • Przechwytywanie żądań od klienta przed uzyskaniem dostępu do zasobu na zapleczu.

  • Aby manipulować odpowiedziami z serwera, zanim zostaną one wysłane z powrotem do klienta.

Istnieją różne typy filtrów sugerowane w specyfikacji -

  • Filtry uwierzytelniania.
  • Filtry kompresji danych.
  • Filtry szyfrowania.
  • Filtry, które wyzwalają zdarzenia dostępu do zasobów.
  • Filtry konwersji obrazu.
  • Filtry logowania i inspekcji.
  • Filtry łańcuchowe TYPU MIME.
  • Filtry tokenizujące.
  • Filtry XSL / T, które przekształcają zawartość XML.

Filtry są wdrażane w pliku deskryptora wdrażania web.xml a następnie odwzoruj na nazwy serwletów lub wzorce adresów URL w deskryptorze wdrażania aplikacji.

Gdy kontener WWW uruchamia aplikację internetową, tworzy instancję każdego filtru zadeklarowanego w deskryptorze wdrażania. Filtry są wykonywane w kolejności, w jakiej są zadeklarowane w deskryptorze wdrażania.

Metody filtrowania serwletów

Filtr to po prostu klasa Java, która implementuje interfejs javax.servlet.Filter. Interfejs javax.servlet.Filter definiuje trzy metody -

Sr.No. Metoda i opis
1

public void doFilter (ServletRequest, ServletResponse, FilterChain)

Ta metoda jest wywoływana przez kontener za każdym razem, gdy para żądanie / odpowiedź jest przesyłana przez łańcuch z powodu żądania klienta dotyczącego zasobu na końcu łańcucha.

2

public void init(FilterConfig filterConfig)

Ta metoda jest wywoływana przez kontener WWW, aby wskazać filtrowi, że jest on wprowadzany do usługi.

3

public void destroy()

Ta metoda jest wywoływana przez kontener WWW, aby wskazać filtrowi, że jest on wycofywany z usługi.

Filtr serwletów - przykład

Poniżej znajduje się przykład filtru serwletu, który wyświetla adres IP klienta i aktualną datę i godzinę. Ten przykład dałby ci podstawową wiedzę na temat filtru serwletów, ale możesz pisać bardziej wyrafinowane aplikacje filtrujące, używając tej samej koncepcji -

// 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*/
   }
}

Skompilować LogFilter.java w zwykły sposób i umieść plik klasy w <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes

Mapowanie filtrów serwletów w Web.xml

Filtry są definiowane, a następnie odwzorowywane na adres URL lub serwlet, w podobny sposób jak definiowany jest serwlet, a następnie odwzorowywany na wzorzec adresu URL. Utwórz następujący wpis dla tagu filtru w pliku deskryptora wdrażaniaweb.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>

Powyższy filtr miałby zastosowanie do wszystkich serwletów, ponieważ podaliśmy /*w naszej konfiguracji. Możesz określić konkretną ścieżkę serwletu, jeśli chcesz zastosować filtr tylko do kilku serwletów.

Teraz spróbuj wywołać dowolny serwlet w zwykły sposób, a zobaczysz wygenerowany dziennik w dzienniku serwera WWW. Możesz użyć loggera Log4J, aby zalogować się powyżej, zaloguj się w oddzielnym pliku.

Korzystanie z wielu filtrów

Twoja aplikacja internetowa może definiować kilka różnych filtrów w określonym celu. Weź pod uwagę, że definiujesz dwa filtry AuthenFilter i LogFilter . Reszta procesu pozostanie taka, jak wyjaśniono powyżej, z wyjątkiem konieczności utworzenia innego mapowania, jak wspomniano poniżej -

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

Kolejność stosowania filtrów

Kolejność elementów odwzorowujących filtry w pliku web.xml określa kolejność, w jakiej kontener WWW stosuje filtr do serwletu. Aby odwrócić kolejność filtra, wystarczy odwrócić elementy odwzorowujące filtry w pliku web.xml.

Na przykład powyższy przykład zastosowałby najpierw LogFilter, a następnie zastosowałby AuthenFilter do dowolnego serwletu, ale poniższy przykład odwróciłby kolejność -

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