2 Eylül 2020 Çarşamba

Filter


  • Filtre sunucuya gelen isteği işledikten sonra servlet'a ileten (pre-processing) ya da servlettan sunucuya iletilecek veriyi işleyerek kullanıcıya ileten (post-processing) bir yapıdır.
  • İşlemleri yetki kontrolü, loglama, encyription-decyription vs. işlemler filtreler ile yapılabilir.
  • Filtrelerle ilgili işlemler web.xml ile ayarlanır, bu sayede filtre değişikliği durumunda servlet'te değişiklik yapmak gerekmez.
  • Servlet Api içinde Filter, FilterChain, FilterConfig interface'leriyle oluşturulur.
  • Filter interface'i init, doFilter ve destroy metodları içerir.
    • init metodu parametre olarak FilterConfig tipinde bir nesne alır. FilterConfig filtre ile ilgili bilgileri içerir ve web container'dan gönderilir (init fonksiyonunu web container çağırır). 
    • doFilter metodu ServletRequest, ServletResponse ve FilterChain tiplerinde parametre alır. Bu metod içinde filtrenin yapması gereken işlemler gerçekleştirilir. Örneğin yetki kontrol filtresi ise, kullanıcının giriş yapıp yapmadığı kontrol edilebilir. Eğer giriş yapmamışsa giriş sayfasına yönlendirir, giriş yapmışsa sonraki filtreye veya istenen servlet'a yönlendirilebilir. Sonraki filtre veya servlet'a yönlendirme FilterChain ile gerçekleştirilir. Web container, web.xml'de belirtilen sıraya göre filtre zinciri oluşturur. Filter.doFilter(ServletRequest, ServletResponse, FilterChain)'daki FilterChain'e parametre olarak bu zinciri yollar. FilterChain de aynı Filter gibi doFilter metodu içerir. Fakat FilterChain.doFilter parametre olarak sadece ServletRequest ve ServletResponse içerir, FilterChain içermez çünkü chain bilgisini kendisi tutar.
      Kısaca web container ilk filtreyi, filtrenin doFilter komutu ile çağırır. Bu filtrede ilgili işlemler yapılır ardından zincirin bir sonraki halkasına geçmesi için bu filtrenin içinde chain.doFilter metodu çağrılır ve bir sonraki filtreye geçer. Bu işlem ilgili servlet'a geldiğinde son bulur.
  • Kullanımı:
web.xml
<filter>
    <filter-name>Filtre1</filter-name>
    <filter-class>Filtre1</filter-class>
    <init-param>
        <param-name>mode</param-name>
        <param-value>debug</param-name>
    </init-param>
</filter>
<filter>
    <filter-name>Filtre3</filter-name>
    <filter-class>Filtre3</filter-class>
</filter>
<filter>
    <filter-name>Filtre2</filter-name>
    <filter-class>Filtre2</filter-class>
</filter>
<filter-mapping>
    <filter-name>Filtre1</filter-name>
    <url-pattern>pattern/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>Filtre2</filter-name>
    <url-pattern> pattern/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>Filtre3</filter-name>
    <url-pattern> pattern/*</url-pattern>
    <url-pattern> pattern2/*</url-pattern>
</filter-mapping> 
MyFilter.java
public class MYFilter implements Filter {
    FilterConfig config;
    public void init(FilterConfig config) { this.config = config }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
        // ...
        String mode = config.getInitParam("mode");
        if( mode.equals("debug") ) {
            // ...
        } else {
            // ...
        }
        chain.doFilter( request, response );
        // ...
}

  • Filtre kullanılırken url-pattern'de tanımlanma sırasına göre çağırılır. 
  • Aynı filtre birden fazla url pattern için geçerli ise bu patternlar aynı filter-mapping içinde yazılabilir.
  • Filtre içinde parametre tanımlanabilir. Bu parametreler FilterConfig içindeki getInitParameter ile okunabilir.
  • FilterConfig getServletContext metodu bulundurur. Bu sayede context ile ilgili işlemler yapılabilir (Parametre yollama vs.)
Kaynaklar:

0 yorum:

Yorum Gönderme