Pambuka kanggo saringan

Nanging ora mung kuwi. Sampeyan pancene ora mikir servlets sing prasaja, ta?

Saliyane servlet sing wis dianalisis, ana uga sing disebut "servlet utilitas" - filters . Dheweke meh padha karo servlet, nanging tugas utama yaiku mbantu servlet ngolah panjaluk.

Filter kaya sekretaris, lan servlet kaya direktur. Sadurunge dokumen tekan meja direktur, bakal liwat tangan sekretaris. Lan sawise direktur mlebu, bakal maneh menyang sekretaris, contone, wis korespondensi metu.

Sekretaris kuwi bisa nolak sawetara panjalukan kanggo direktur (contone, spam). Utawa menehi jawaban standar kanggo pitakonan sing dikenal kanggo dheweke ("direktur ora ing panggonan"). Lan sateruse. Kajaba iku, bisa uga ana sawetara sekretaris kasebut: siji bisa nyaring spam kanggo kabeh direktur sekaligus, liyane bisa nransfer panjalukan antarane direktur sing beda-beda, lan liya-liyane.

Filter-filter bisa digunakake kanthi cara sing padha.

layanan utilitas”

Filter Kelas, FilterChain, FilterConfig

Filter-filter meh padha karo servlets, nanging karo sawetara beda cilik. Kanggo nulis filter sampeyan dhewe, sampeyan kudu entuk warisan saka javax.servlet.Filter.

Filter uga nduweni cara init()lan destroy(). Tinimbang metode, service()saringan duwe doFilter(). Lan malah duwe FilterConfig kelas dhewe. Filter kasebut uga ditambahake menyang servlet ing file web.xml utawa liwat anotasi @WebFilter.

Daftar metode:

Metode Katrangan
1 init(FilterConfig config) initialization panyaring
2 destroy() unloading saringan
3 doFilter(ServletRequest , ServletResponse, FilterChain) panyuwunan pangolahan (filtering)

Punapa punika prabédan antarane servlet lan Filter?

Ana sawetara saringan, lan padha proses panjalukan (lan respon). Digabungake dadi rantai sing diarani - lan malah ana kelas khusus kanggo dheweke FilterChain.

Sawise ngolah panyuwunan ing metode kasebut, doFilter()sampeyan kudu nelpon metode doFilter()panyaring sabanjure ing rantai kasebut. Tuladha:

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

Bener, sampeyan ora bisa nambah awak respon kaya ngono . Sacara resmi, saringan lan servlet bebas saka siji liyane lan bisa diganti kanthi mandiri. Bisa ditulis dening pangembang beda ing wektu sing beda. Fungsi saringan mung minangka fungsi layanan, contone:

  • Log kabeh panjalukan mlebu (lan tanggapan)
  • Kompresi data
  • Enkripsi (lan dekripsi) data
  • Njaluk Validasi Data
  • Tambah / mbusak header sing dikarepake
  • Panjaluk pangalihan
  • Kontrol akses (mriksa manawa pangguna wis mlebu)

Kelas RequestDispatcher

doFilter() Kadhangkala sampeyan kudu nelpon servlet liyane nalika saringan mlaku ing sawijining metode . Kanggo nindakake iki, wadhah kasebut duwe obyek khusus RequestDispatcher.

Sampeyan bisa njaluk kanthi rong cara:

  • Ing obyekHttpServletRequest
  • Ing obyekServletContext

Objek iki bisa digunakake kanggo ngarahake panjalukan sing wis ana menyang servlet liyane . Contone, ternyata pangguna ora sah lan kita pengin nuduhake kaca kanthi wewenang. Ya, utawa ana kesalahan ing server lan kita pengin nampilake kaca kesalahan menyang pangguna :)

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

Sampeyan uga bisa nelpon RequestDispatchersaka saringan.

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

Elinga yen panyuwunan bakal ditangani kanthi cara kasebut forward()lan ora perlu nelpon doFilter()sawise digunakake RequestDispatcher.

Perbandingan pangalihan lan maju

Lan siji liyane penting. Yen sampeyan pengin ngarahake pangguna menyang URI liyane ing servlet sampeyan, sampeyan bisa nindakake iki kanthi rong cara:

  • redirect
  • forward

Kita wis nganalisa, nanging kanggo kepenak aku bakal ujar maneh.

Nalika sampeyan pangalihan liwat telpon response.sendRedirect("link"), server ngirim bali menyang browser (klien) respon 302lan link sing sampeyan nemtokake. Lan browser, sawise nganalisa respon server, download link sing liwati. Yaiku, link ing browser diganti dadi anyar.

Yen sampeyan nerusake liwat telpon requestDispatcher.forward(), banjur panjalukan anyar digawe ing wadhah kasebut, lan servlet sampeyan ngirim respon menyang browser (klien) minangka respon servlet sampeyan. Ing kasus iki, browser nampa respon saka servlet anyar, nanging link ing browser ora ngganti.