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>