CodeGym/Kursy Java/Moduł 3/Filtry serwera WWW

Filtry serwera WWW

Dostępny

Wprowadzenie do filtrów

Ale to nie wszystko. Naprawdę nie sądzisz, że serwlety są takie proste, prawda?

Oprócz serwletów, które już przeanalizowaliśmy, istnieją również tak zwane „servlety użytkowe” - filtry . Są bardzo podobne do serwletów, ale ich głównym zadaniem jest pomoc serwletom w przetwarzaniu żądań.

Filtr jest jak sekretarz, a serwlet jak dyrektor. Zanim dokument trafi na biurko dyrektora, przejdzie przez ręce sekretarza. A po jej podpisaniu przez dyrektora znowu trafi do sekretariatu, już jako np. korespondencja wychodząca.

Taka sekretarka może odrzucić niektóre prośby kierowane do dyrektora (na przykład spam). Lub udzielaj standardowych odpowiedzi na znane mu pytania („dyrektora nie ma na miejscu”). I tak dalej. Co więcej, może istnieć kilka takich sekretarek: jeden może filtrować spam dla wszystkich dyrektorów jednocześnie, drugi może przekazywać żądania między różnymi dyrektorami i tym podobne.

Filtry działają w ten sam sposób.

serwlety użytkowe”

Klasy Filter, FilterChain, FilterConfig

Filtry są bardzo podobne do serwletów, ale z kilkoma drobnymi różnicami. Aby napisać własny filtr, musisz dziedziczyć po javax.servlet.Filter.

Filtr ma również metody init()i destroy(). Zamiast metody service()filtr ma plik doFilter(). I ma nawet własną klasę FilterConfig. Filtr jest również dodawany do serwletu w pliku web.xml lub poprzez adnotację @WebFilter.

Lista metod:

Metody Opis
1 init(FilterConfig config) inicjalizacja filtra
2 destroy() rozładowanie filtra
3 doFilter(ServletRequest , ServletResponse, FilterChain) przetwarzanie żądań (filtrowanie)

Jaka jest różnica między serwletem a filtrem?

Może istnieć kilka filtrów, które sekwencyjnie przetwarzają żądanie (i odpowiedź). Są one łączone w tzw. łańcuch – i jest dla nich nawet specjalna klasa FilterChain.

Po przetworzeniu żądania w metodzie doFilter()należy wywołać metodę doFilter()kolejnego filtra w łańcuchu. Przykład:

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() {
  }
}

Właściwie nie możesz dodać treści odpowiedzi w ten sposób . Formalnie filtry i serwlety są od siebie niezależne i mogą być zmieniane niezależnie. Mogą być pisane przez różnych programistów w różnym czasie. Funkcja filtrowania jest tylko funkcją serwisową, na przykład:

  • Rejestrowanie wszystkich przychodzących żądań (i odpowiedzi)
  • Kompresja danych
  • Szyfrowanie (i deszyfrowanie) danych
  • Poproś o weryfikację danych
  • Dodaj/usuń żądane nagłówki
  • Żądania przekierowania
  • Kontrola dostępu (sprawdzanie czy użytkownik jest zalogowany)

Klasa RequestDispatcher

doFilter() Czasami może być konieczne wywołanie innego serwletu, gdy filtr działa w ramach metody . Aby to zrobić, kontener ma specjalny obiekt RequestDispatcher.

Możesz go zdobyć na dwa sposoby:

  • na obiekcieHttpServletRequest
  • na obiekcieServletContext

Ten obiekt może być użyty do przekierowania istniejącego żądania do innego serwletu . Na przykład okazało się, że użytkownik nie jest autoryzowany i chcemy mu pokazać stronę z uprawnieniami. Cóż, albo wystąpił błąd na serwerze i chcemy wyświetlić użytkownikowi stronę błędu :)

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);
    }
}

Możesz także dzwonić RequestDispatcherz filtra.

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() {
  }
}

Zauważ, że żądanie zostanie obsłużone w metodzie forward()i nie ma potrzeby wywoływania doFilter()po użyciu RequestDispatcher.

Porównanie przekierowania i przekierowania

I jeszcze jeden ważny punkt. Jeśli chcesz przekierować użytkownika do innego URI w swoim serwlecie, możesz to zrobić na dwa sposoby:

  • redirect
  • forward

Już je przeanalizowaliśmy, ale dla wygody powiem to jeszcze raz.

Kiedy przekierowujesz przez wywołanie response.sendRedirect("link"), serwer odsyła do przeglądarki (klienta) odpowiedź 302i podany przez Ciebie link. A przeglądarka po przeanalizowaniu odpowiedzi serwera pobiera przekazany link. Oznacza to, że link w przeglądarce zmienia się na nowy.

Jeśli przekazujesz dalej przez wywołanie requestDispatcher.forward(), to wewnątrz kontenera wysyłane jest nowe żądanie, a twój serwlet wysyła swoją odpowiedź do przeglądarki (klienta) jako odpowiedź twojego serwletu. W takim przypadku przeglądarka otrzymuje odpowiedź z nowego serwletu, ale łącze w przeglądarce nie zmienia się.

Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy