Örnek Filtre Uygulaması

Bir sınıfın filtre olduğunu container’a söylememiz gerekir. Bunun için ;

  1. Sınıf Filter arayüzünü implement etmelidir,
  2. web.xml dosyasında filtre tanımı ve mapping’i yapılmalıdır.

Eğer bir uygulamada birden fazla filtre varsa konfigurasyon dosyasında tanımlı oldukları sırayla çalışırlar.

[codesyntax lang="xml" lines="no"]
<filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>com.javauzmani.filtreOrnekleri.filters.LoginFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>loginFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping>
[/codesyntax]

<filter-class> filtre sınıfımızın proje içerisindeki yerini belirlediğimiz etikettir.

<url-pattern> ise hangi isteklerde filtrenin çalışacağını belirlediğimiz kısımdır. /* gibi bir ifadeyle gelen tüm isteklerin bizim filtremizden geçeceğini söylemiş oluruz.

Basit bir filtre sınıfının kodu da aşağıdaki gibi olacaktır.

[codesyntax lang="java" lines="no"]
package com.javauzmani.filtreOrnekleri.filters;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class LoginFilter implements Filter {

	public void destroy() {
	}

	public void doFilter(ServletRequest req, ServletResponse response,
	        FilterChain chain) throws IOException, ServletException {
		System.out.println("filtre cagrildi.");
		HttpServletRequest request = (HttpServletRequest) req;
		HttpSession session = request.getSession();
		String url = request.getServletPath();
		if (url.equals("/index.jsp") || url.equals("/giris")) {
			chain.doFilter(request, response);
		} else if (session.getAttribute("login") != null) {
			chain.doFilter(request, response);
		} else {
			req.setAttribute("mesaj", "Önce giriş yapmalısınız.");
			request.getRequestDispatcher("/index.jsp").forward(request,response);
		}
	}

	public void init(FilterConfig filterConfig) throws ServletException {
	}
}
[/codesyntax]

Tüm filtrelerin Filter arayüzünü implement etmesi gerekir. Bu interface’de tanımlanan 3 metod vardır.

init() : Filtrenin yaşam evresi boyunca bir defa çağrılır. Bu metodun işi bitmeden container filtreye başka request göndermez. Servlet’in init() metodu gibi çalışıyor. Genellikle FilterConfig objesini implement etmek için kullanılır.

doFilter() : Servletteki service() metodu gibi. Filtreye gelen her istek için bu metod çalıştırılıyor. Bu metod içerisinden 3 iş yapılabiliyor. Request’i başka bir filtreye, başka bir kaynağa yönlendirebilir. Ya da kendisi cevap dönebilir. doFilter() metodunun parametresi olan request ve response, ServletRequest ve ServletResponse tipindedir. Yani sadece HTTP istekleri için geçerli değildir. Web uygulamasında HttpServletRequest ve HttpServletResponse objelerini ifade eder. Cast ederek bu tiplere ulaşırız.

        Bu metodun kullanımı filtreden filtreye değişir. Bazısında filtre URL’yi, parametreleri, başlıkları alıp bunları dosyaya yazabilir. (örneğin loglamak için) ya da güvenlik filtresi gelen isteği kaynağa yönlendirip yönlendirmeyeceğine karar verir. Bir başkası da ServletRequest ve ServletResponse parametre objelerini sarmalar, istek ve cevabı kısmen veya tamamen değiştirir. Ya da RequestDispatcher üzerinden include() ve forward() metodları ile yönlendirme yapar.

destroy() : Servletteki destroy() gibi. Filtrenin kaynakları bırakmak için kullandığı metod. Yaşam ömrü sona ermeden çalışır.

NOT : Filtreler her istek için iki defa çalışır.

  1. Request gönderilirken,
  2. Response dönerken.

Dolayısıyla yazmış olduğumuz kodda “filtre çağrıldı” konsola iki kez yazılacaktır.

Filters

Filtreler kaynak ile hedef arasındaki mesajı filtreleyen objelerdir. Koruma görevlisi gibi çalışırlar. Veri aktarımını kontrol ederler. Örneğin DSL filtresi (Digital Subscriber Line) telefon ve DSL hattı arasında bulunur. Telefon frekanslarını telefona, diğerlerini modeme yönlendirir. TCP/IP protokolünde IP katmanı kendisine ait olan bilgileri çıkarıp TCP katmanına gönderir.

Bir web uygulaması için filtre bir web bileşenidir ve web server’da yer alır. İstemci ve kaynak arasında gidip gelen request-response’ları filtreler.

İstekler servlete giderken web.xml’de tanımlanmış olduğu sırayla filtrelerden geçerler. Servletten gelen response ise tam ters sırayla filtrelerden tekrar geçerler.

Filtre isterse request’e cevap döndürür, isterse başka bir filtreye geçmesini sağlar, isterse de kaynağa yönlendirir. Request’in filtreye yönlendirilme işlemini container yapar. Container’ın filtre kullanıldığını anlaması için web.xml’de filtre tanımı yapılır.

                Filtre Çeşitleri :

  1. Kimlik denetleme (authentication) işlemlerinde,
  2. Loglama işlemleri,
  3. Resim dönüştürme,
  4. Veri sıkıştırma,
  5. Şifreleme,
  6. MIME tipi filtre zincirleri kullanılır.