Sunucular - Yazma Filtreleri

Sunucu Filtreleri, aşağıdaki amaçlarla Servlet Programlamada kullanılabilen Java sınıflarıdır -

  • Arka uçta bir kaynağa erişmeden önce istemciden gelen istekleri engellemek için.

  • İstemciye geri gönderilmeden önce sunucudan gelen yanıtları değiştirmek için.

Spesifikasyonların önerdiği çeşitli filtre türleri vardır -

  • Kimlik Doğrulama Filtreleri.
  • Veri sıkıştırma Filtreleri.
  • Şifreleme Filtreleri.
  • Kaynak erişim olaylarını tetikleyen filtreler.
  • Görüntü Dönüştürme Filtreleri.
  • Günlük Kaydı ve Denetleme Filtreleri.
  • MIME TİPİ Zincir Filtreleri.
  • Simgeleştirme Filtreleri.
  • XML İçeriğini Dönüştüren XSL / T Filtreleri.

Filtreler, dağıtım tanımlayıcı dosyasında dağıtılır web.xml ve sonra uygulamanızın dağıtım tanımlayıcısındaki sunucu uygulaması adlarıyla veya URL modelleriyle eşleyin.

Web kapsayıcısı web uygulamanızı başlattığında, dağıtım tanımlayıcısında bildirdiğiniz her filtrenin bir örneğini oluşturur. Filtreler, dağıtım tanımlayıcısında bildirildikleri sırayla yürütülür.

Servlet Filtre Yöntemleri

Filtre, javax.servlet.Filter arabirimini uygulayan bir Java sınıfıdır. Javax.servlet.Filter arabirimi üç yöntem tanımlar -

Sr.No. Yöntem ve Açıklama
1

public void doFilter (ServletRequest, ServletResponse, FilterChain)

Bu yöntem, zincirin sonundaki bir kaynak için bir istemci talebi nedeniyle zincirden bir istek / yanıt çifti her geçtiğinde konteyner tarafından çağrılır.

2

public void init(FilterConfig filterConfig)

Bu yöntem, hizmete konulmakta olduğunu bir filtreye belirtmek için web kapsayıcısı tarafından çağrılır.

3

public void destroy()

Bu yöntem, hizmet dışı bırakıldığını bir filtreye belirtmek için web kapsayıcısı tarafından çağrılır.

Servlet Filtresi - Örnek

Aşağıda, istemcilerin IP adresini ve geçerli tarih saatini yazdıran Servlet Filtresi Örneği verilmiştir. Bu örnek size Servlet Filter hakkında temel bir anlayış verecektir, ancak aynı konsepti kullanarak daha gelişmiş filtre uygulamaları yazabilirsiniz -

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

Derleme LogFilter.java olağan şekilde ve sınıf dosyanızı <Tomcat-installationdirectory> / webapps / ROOT / WEB-INF / classes içine koyun

Web.xml'de Servlet Filtresi Eşleme

Filtreler tanımlanır ve sonra bir URL'ye veya Servlet'e eşlenir, tıpkı Servlet'in tanımlanmasıyla aynı şekilde ve daha sonra bir URL modeline eşlenir. Dağıtım tanımlayıcı dosyasında filtre etiketi için aşağıdaki girişi oluşturunweb.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>

Yukarıdaki filtre, belirttiğimiz için tüm sunucu uygulamaları için geçerli olacaktır. /*konfigürasyonumuzda. Yalnızca birkaç sunucu uygulamasına filtre uygulamak istiyorsanız, belirli bir sunucu uygulaması yolu belirtebilirsiniz.

Şimdi herhangi bir servlet'i normal şekilde çağırmayı deneyin ve web sunucusu günlüğünüzde oluşturulan günlük göreceksiniz. Yukarıdaki logu ayrı bir dosyada oturum açmak için Log4J logger'ı kullanabilirsiniz.

Birden Çok Filtre Kullanmak

Web uygulamanız, belirli bir amaç için birkaç farklı filtre tanımlayabilir. AuthenFilter ve LogFilter olmak üzere iki filtre tanımladığınızı düşünün . Aşağıda belirtildiği gibi farklı bir eşleme oluşturmanız gerekmesi dışında, sürecin geri kalanı yukarıda açıklandığı gibi kalacaktır -

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

Filtreler Uygulama Sırası

Web.xml'deki filtre eşleme öğelerinin sırası, web kapsayıcısının filtreyi sunucu uygulamasına uygulama sırasını belirler. Filtrenin sırasını tersine çevirmek için, web.xml dosyasındaki filtre eşleme öğelerini ters çevirmeniz yeterlidir.

Örneğin, yukarıdaki örnek önce LogFilter'i uygular ve ardından herhangi bir sunucu uygulamasına AuthenFilter uygular ancak aşağıdaki örnek sıralamayı tersine çevirir -

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