Servlet - Filtri di scrittura

I filtri servlet sono classi Java che possono essere utilizzate nella programmazione servlet per i seguenti scopi:

  • Per intercettare le richieste di un client prima che acceda a una risorsa nel back-end.

  • Per manipolare le risposte dal server prima che vengano rispedite al client.

Esistono vari tipi di filtri suggeriti dalle specifiche:

  • Filtri di autenticazione.
  • Filtri di compressione dei dati.
  • Filtri di crittografia.
  • Filtri che attivano eventi di accesso alle risorse.
  • Filtri di conversione delle immagini.
  • Filtri di registrazione e controllo.
  • Filtri catena TIPO MIME.
  • Filtri di tokenizzazione.
  • Filtri XSL / T che trasformano il contenuto XML.

I filtri vengono distribuiti nel file descrittore di distribuzione web.xml e quindi eseguire il mapping ai nomi dei servlet o ai pattern URL nel descrittore di distribuzione dell'applicazione.

Quando il contenitore web avvia la tua applicazione web, crea un'istanza di ogni filtro che hai dichiarato nel descrittore di distribuzione. I filtri vengono eseguiti nell'ordine in cui sono dichiarati nel descrittore di distribuzione.

Metodi di filtro servlet

Un filtro è semplicemente una classe Java che implementa l'interfaccia javax.servlet.Filter. L'interfaccia javax.servlet.Filter definisce tre metodi:

Sr.No. Metodo e descrizione
1

public void doFilter (ServletRequest, ServletResponse, FilterChain)

Questo metodo viene chiamato dal contenitore ogni volta che una coppia richiesta / risposta viene passata attraverso la catena a causa di una richiesta del client per una risorsa alla fine della catena.

2

public void init(FilterConfig filterConfig)

Questo metodo viene chiamato dal contenitore Web per indicare a un filtro che viene messo in servizio.

3

public void destroy()

Questo metodo viene chiamato dal contenitore Web per indicare a un filtro che è stato messo fuori servizio.

Filtro servlet - Esempio

Di seguito è riportato l'esempio di filtro servlet che stampa l'indirizzo IP dei client e la data e l'ora correnti. Questo esempio ti darebbe una conoscenza di base del Servlet Filter, ma puoi scrivere applicazioni di filtro più sofisticate usando lo stesso concetto -

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

Compilare LogFilter.java nel solito modo e metti il ​​tuo file di classe in <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes

Mappatura filtri servlet in Web.xml

I filtri vengono definiti e quindi mappati a un URL o servlet, in modo molto simile a come viene definito Servlet e quindi mappato a un pattern URL. Creare la seguente voce per il tag di filtro nel file descrittore di distribuzioneweb.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>

Il filtro sopra si applicherebbe a tutti i servlet perché abbiamo specificato /*nella nostra configurazione. È possibile specificare un particolare percorso servlet se si desidera applicare il filtro solo a pochi servlet.

Ora prova a chiamare qualsiasi servlet nel solito modo e vedrai il log generato nel log del tuo server web. È possibile utilizzare il logger Log4J per accedere al registro sopra in un file separato.

Utilizzo di più filtri

La tua applicazione web può definire diversi filtri differenti con uno scopo specifico. Considera di definire due filtri AuthenFilter e LogFilter . Il resto del processo rimarrà come spiegato sopra tranne che è necessario creare una mappatura diversa come indicato di seguito -

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

Ordine applicazione filtri

L'ordine degli elementi di mappatura del filtro in web.xml determina l'ordine in cui il contenitore web applica il filtro al servlet. Per invertire l'ordine del filtro, è sufficiente invertire gli elementi di mappatura del filtro nel file web.xml.

Ad esempio, l'esempio precedente applica prima LogFilter e quindi applica AuthenFilter a qualsiasi servlet, ma l'esempio seguente inverte l'ordine:

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