JSP - Filtry

W tym rozdziale omówimy filtry w JSP. Filtry serwletów i JSP to klasy Java, których można używać w programowaniu serwletów i JSP 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.xmla następnie zamapuj na nazwy serwletów lub JSP lub wzorce adresów URL w deskryptorze wdrażania aplikacji. Plik deskryptora wdrażania web.xml można znaleźć w katalogu <Tomcat-installation-directory> \ conf .

Gdy kontener JSP uruchamia aplikację WWW, 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 javax.servlet.Filterberło. Interfejs javax.servlet.Filter definiuje trzy metody -

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

Przykład filtru JSP

Poniższy przykład pokazuje, jak wydrukować adres IP klienta i aktualną datę i godzinę za każdym razem, gdy uzyska dostęp do dowolnego pliku JSP. Ten przykład da ci podstawową wiedzę na temat filtru JSP, 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ść swój plik LogFilter.class plik w <Tomcat-installation-directory>/webapps/ROOT/WEB-INF/classes.

Mapowanie filtrów JSP w pliku Web.xml

Filtry są definiowane, a następnie odwzorowywane na adres URL lub nazwę pliku JSP, w podobny sposób, jak definiowany jest serwlet, a następnie odwzorowywany na wzorzec adresu URL w web.xmlplik. 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 będzie miał zastosowanie do wszystkich serwletów i stron JSP, ponieważ określiliśmy /*w naszej konfiguracji. Możesz określić konkretny serwlet lub ścieżkę JSP, jeśli chcesz zastosować filtr do kilku serwletów lub tylko do JSP.

Teraz spróbuj wywołać dowolny serwlet lub JSP, a zobaczysz wygenerowany dziennik w dzienniku serwera WWW. Możesz użyćLog4J logger aby zalogować się powyżej zaloguj się w osobnym 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 lub strony JSP. Aby odwrócić kolejność filtra, wystarczy odwrócić elementy mapowania filtrów w plikuweb.xml plik.

Na przykład powyższy przykład zastosuje najpierw LogFilter, a następnie AuthenFilter do dowolnego serwletu lub strony JSP; Poniższy przykład odwróci 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>