CodeGym/Java Course/Modul 3/Filter server web

Filter server web

Level 12, Pelajaran 5
Tersedia

Pengantar filter

Tapi itu belum semuanya. Anda benar-benar tidak menganggap servlet sesederhana itu, bukan?

Selain servlet yang telah kami analisis, ada juga yang disebut "servlet utilitas" - filter . Mereka sangat mirip dengan servlet, tetapi tugas utama mereka adalah membantu servlet memproses permintaan.

Filter seperti sekretaris, dan servlet seperti direktur. Sebelum dokumen mencapai meja direktur, itu akan melewati tangan sekretaris. Dan setelah direktur menandatanganinya, itu akan kembali ke sekretaris, sudah sebagai korespondensi keluar, misalnya.

Sekretaris seperti itu dapat menolak beberapa permintaan kepada direktur (misalnya, spam). Atau berikan jawaban standar untuk pertanyaan yang diketahuinya ("sutradara tidak ada di tempat"). Dan seterusnya. Selain itu, mungkin ada beberapa sekretaris seperti itu: yang satu dapat memfilter spam untuk semua direktur sekaligus, yang lain dapat mentransfer permintaan antara direktur yang berbeda, dan sejenisnya.

Filter bekerja dengan cara yang sama.

servlet utilitas”

Kelas Filter, FilterChain, FilterConfig

Filter sangat mirip dengan servlet, tetapi dengan beberapa perbedaan kecil. Untuk menulis filter Anda sendiri, Anda perlu mewarisi dari javax.servlet.Filter.

Filter juga memiliki metode init()dan destroy(). Alih-alih metode, service()filter memiliki doFilter(). Dan bahkan memiliki kelas FilterConfig sendiri. Filter juga ditambahkan ke servlet di file web.xml atau melalui anotasi @WebFilter.

Daftar metode:

Metode Keterangan
1 init(FilterConfig config) inisialisasi filter
2 destroy() bongkar filter
3 doFilter(ServletRequest , ServletResponse, FilterChain) pemrosesan permintaan (penyaringan)

Apa perbedaan antara servlet dan filter?

Mungkin ada beberapa filter, dan mereka memproses permintaan (dan respons) secara berurutan. Mereka digabungkan menjadi apa yang disebut rantai - dan bahkan ada kelas khusus untuk mereka FilterChain.

Setelah memproses permintaan dalam metode, doFilter()Anda perlu memanggil metode doFilter()filter berikutnya dalam rangkaian. Contoh:

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

Sebenarnya, Anda tidak dapat menambahkan badan respons seperti itu . Secara formal, filter dan servlet tidak bergantung satu sama lain dan dapat diubah secara independen. Mereka dapat ditulis oleh pengembang yang berbeda pada waktu yang berbeda. Fungsi filter hanyalah fungsi layanan, misalnya:

  • Mencatat semua permintaan masuk (dan tanggapan)
  • Kompresi data
  • Enkripsi (dan dekripsi) data
  • Minta Validasi Data
  • Tambahkan/hapus tajuk yang diinginkan
  • Permintaan pengalihan
  • Kontrol akses (memeriksa apakah pengguna masuk)

kelas RequestDispatcher

doFilter() Kadang-kadang mungkin diperlukan untuk memanggil servlet lain saat filter sedang berjalan di dalam sebuah metode . Untuk melakukan ini, wadah memiliki objek khusus RequestDispatcher.

Anda bisa mendapatkannya dengan dua cara:

  • Di objekHttpServletRequest
  • Di objekServletContext

Objek ini dapat digunakan untuk mengalihkan permintaan yang ada ke servlet lain . Misalnya, ternyata pengguna tidak diotorisasi dan kami ingin menunjukkan kepadanya halaman dengan otorisasi. Ya, atau ada kesalahan di server dan kami ingin menampilkan halaman kesalahan kepada pengguna :)

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

Anda juga dapat menelepon RequestDispatcherdari filter.

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

Perhatikan bahwa permintaan akan ditangani dalam metode ini forward()dan tidak perlu menelepon doFilter()setelah digunakan RequestDispatcher.

Perbandingan pengalihan dan penerusan

Dan satu poin penting lagi. Jika Anda ingin mengalihkan pengguna ke URI lain di servlet Anda, Anda dapat melakukannya dengan dua cara:

  • redirect
  • forward

Kami sudah menganalisisnya, tetapi untuk kenyamanan saya akan mengatakannya lagi.

Saat Anda mengalihkan melalui panggilan response.sendRedirect("link"), server mengirimkan kembali ke browser (klien) respons 302dan tautan yang Anda tentukan. Dan browser, setelah menganalisis respons server, mengunduh tautan yang Anda berikan. Artinya, tautan di browser berubah menjadi yang baru.

Jika Anda meneruskan melalui panggilan requestDispatcher.forward(), maka permintaan baru dibuat di dalam wadah, dan servlet Anda mengirimkan responsnya ke browser (klien) sebagai respons servlet Anda. Dalam hal ini, browser menerima respons dari servlet baru, tetapi tautan di browser tidak berubah.

Komentar
  • Populer
  • Baru
  • Lama
Anda harus login untuk memberikan komentar
Halaman ini belum memiliki komentar