CodeGym/Java Kursu/Modül 3/Web sunucusu filtreleri

Web sunucusu filtreleri

Mevcut

Filtrelere giriş

Ama hepsi bu değil. Gerçekten servletlerin bu kadar basit olduğunu düşünmüyorsunuz, değil mi?

Daha önce analiz ettiğimiz servlet'lere ek olarak, "yardımcı program servlet'leri" - filtreler de vardır . Sunucu uygulamacıklarına çok benzerler, ancak asıl görevleri sunucu uygulamacıklarının istekleri işleme koymasına yardımcı olmaktır.

Filtre, sekreter gibidir ve servlet, yönetici gibidir. Belge müdür masasına ulaşmadan önce sekreterin elinden geçer. Ve yönetmen imzaladıktan sonra, örneğin zaten giden yazışmalar olarak tekrar sekretere gidecek.

Böyle bir sekreter, yöneticiye gelen bazı istekleri (örneğin spam) reddedebilir. Veya bildiği sorulara standart cevaplar verin ("yönetmen yerinde değil"). Ve benzeri. Ayrıca, bu tür birkaç sekreter olabilir: biri aynı anda tüm yöneticiler için istenmeyen e-postaları filtreleyebilir, diğeri istekleri farklı yöneticiler arasında aktarabilir ve benzerleri.

Filtreler aynı şekilde çalışır.

yardımcı sunucu uygulamacıkları”

Sınıflar Filter, FilterChain, FilterConfig

Filtreler sunucu uygulamacıklarına çok benzer, ancak birkaç küçük fark vardır. Kendi filtrenizi yazmak için javax.servlet.Filter.

Filtrenin ayrıca yöntemleri vardır init()ve destroy(). Bir yöntem yerine, service()bir filtrenin bir doFilter(). Ve hatta kendi sınıfı FilterConfig'e sahiptir. Filtre ayrıca web.xml dosyasındaki sunucu uygulamasına veya @WebFilter ek açıklaması aracılığıyla eklenir.

Yöntemlerin listesi:

Yöntemler Tanım
1 init(FilterConfig config) filtre başlatma
2 destroy() filtre boşaltma
3 doFilter(ServletRequest , ServletResponse, FilterChain) istek işleme (filtreleme)

Sunucu uygulaması ile filtre arasındaki fark nedir?

Birkaç filtre olabilir ve bunlar isteği (ve yanıtı) sırayla işler. Sözde bir zincir halinde birleştirilirler - ve onlar için özel bir sınıf bile vardır FilterChain.

Yöntemde isteği işledikten sonra, zincirdeki bir sonraki filtrenin doFilter()yöntemini çağırmanız gerekir . doFilter()Örnek:

public class MyFilter implements Filter {

  public void init(FilterConfig arg0) throws ServletException {
  }

  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws Exception {

      PrintWriter out = resp.getWriter();
      out.print("Adding something before the body of the response");

      chain.doFilter(req, resp); // call the next filter in the chain

      out.print("Adding something after the body of the response");
    }

  public void destroy() {
  }
}

Aslında, yanıt gövdesini bu şekilde ekleyemezsiniz . Resmi olarak, filtreler ve servlet'ler birbirinden bağımsızdır ve bağımsız olarak değiştirilebilir. Farklı geliştiriciler tarafından farklı zamanlarda yazılabilirler. Filtre işlevi yalnızca bir hizmet işlevidir, örneğin:

  • Gelen tüm isteklerin (ve yanıtların) günlüğe kaydedilmesi
  • Veri sıkıştırma
  • Verilerin şifrelenmesi (ve şifresinin çözülmesi)
  • Veri Doğrulaması İste
  • İstenilen başlıkları ekleyin/kaldırın
  • Yönlendirme istekleri
  • Erişim kontrolü (kullanıcının oturum açıp açmadığını kontrol etme)

RequestDispatcher sınıfı

Bazen bir metot içerisinde bir filtre çalışırken doFilter() başka bir sunucu uygulamasını çağırmak gerekebilir . Bunu yapmak için kapsayıcının özel bir nesnesi vardır RequestDispatcher.

İki şekilde alabilirsiniz:

  • nesnedeHttpServletRequest
  • nesnedeServletContext

Bu nesne, mevcut bir isteği başka bir sunucu uygulamasına yönlendirmek için kullanılabilir . Örneğin, kullanıcının yetkili olmadığı ortaya çıktı ve ona yetkili bir sayfa göstermek istiyoruz. Peki ya sunucuda bir hata oluştu ve kullanıcıya bir hata sayfası göstermek istiyoruz :)

public class HelloServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)  throws Exception {
           String path = "/error.html";
           ServletContext servletContext = this.getServletContext();
           RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher(path);
           requestDispatcher.forward(request, response);
    }
}

RequestDispatcherBir filtreden de arayabilirsiniz .

public class MyFilter implements Filter {

  public void init(FilterConfig arg0) throws ServletException {
  }

  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws Exception {
           String path = "/error.html";
           ServletContext servletContext = req.getServletContext();
           RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher(path);
           requestDispatcher.forward(req, resp);
    }

  public void destroy() {
  }
}

İsteğin yöntemde ele alınacağını ve kullanımdan sonra forward()aramaya gerek olmadığını unutmayın .doFilter()RequestDispatcher

Yönlendirme ve iletmenin karşılaştırılması

Ve bir önemli nokta daha. Kullanıcıyı sunucu uygulamanızdaki başka bir URI'ye yönlendirmek istiyorsanız, bunu iki şekilde yapabilirsiniz:

  • redirect
  • forward

Onları zaten analiz ettik, ancak kolaylık olması için tekrar söyleyeceğim.

Bir arama yoluyla yönlendirme yaptığınızda response.sendRedirect("link"), sunucu tarayıcıya (istemciye) bir yanıt 302ve belirttiğiniz bağlantıyı geri gönderir. Ve tarayıcı, sunucu yanıtını analiz ettikten sonra, ilettiğiniz bağlantıyı indirir. Yani, tarayıcıdaki bağlantı yenisiyle değişir.

Bir çağrı yoluyla iletirseniz , kapsayıcı içinde yeni bir istek yapılır ve sunucu uygulamanız yanıtını sunucu uygulamanızın yanıtı olarak tarayıcıya (istemciye) gönderir . requestDispatcher.forward()Bu durumda, tarayıcı yeni sunucu uygulamasından bir yanıt alır, ancak tarayıcıdaki bağlantı değişmez.

Yorumlar
  • Popüler
  • Yeni
  • Eskimiş
Yorum bırakmak için giriş yapmalısınız
Bu sayfada henüz yorum yok