CodeGym/Kursus Java/Modul 3/Penapis pelayan web

Penapis pelayan web

Tahap, pelajaran
Tersedia

Pengenalan kepada penapis

Tetapi bukan itu sahaja. Anda benar-benar tidak fikir servlet semudah itu, bukan?

Sebagai tambahan kepada servlet yang telah kami analisis, terdapat juga yang dipanggil "servlet utiliti" - penapis . Mereka sangat serupa dengan servlet, tetapi tugas utama mereka adalah untuk membantu servlet memproses permintaan.

Penapis adalah seperti setiausaha, dan servlet adalah seperti pengarah. Sebelum dokumen itu sampai ke meja pengarah, ia akan melalui tangan setiausaha. Dan selepas pengarah menandatanganinya, ia akan sekali lagi pergi ke setiausaha, sudah sebagai surat-menyurat keluar, sebagai contoh.

Setiausaha sedemikian boleh menolak beberapa permintaan kepada pengarah (contohnya, spam). Atau berikan jawapan standard kepada soalan yang diketahuinya (“pengarah tiada di tempat”). Dan sebagainya. Selain itu, mungkin terdapat beberapa setiausaha sedemikian: seseorang boleh menapis spam untuk semua pengarah sekaligus, yang lain boleh memindahkan permintaan antara pengarah yang berbeza, dan sebagainya.

Penapis berfungsi dengan cara yang sama.

servlet utiliti”

Penapis Kelas, Rantai Penapis, FilterConfig

Penapis sangat serupa dengan servlet, tetapi dengan beberapa perbezaan kecil. Untuk menulis penapis anda sendiri, anda perlu mewarisi daripada javax.servlet.Filter.

Penapis juga mempunyai kaedah init()dan destroy(). Daripada kaedah, service()penapis mempunyai doFilter(). Dan juga mempunyai FilterConfig kelasnya sendiri. Penapis juga ditambahkan pada servlet dalam fail web.xml atau melalui anotasi @WebFilter.

Senarai kaedah:

Kaedah Penerangan
1 init(FilterConfig config) permulaan penapis
2 destroy() pemunggahan penapis
3 doFilter(ServletRequest , ServletResponse, FilterChain) pemprosesan permintaan (penapisan)

Apakah perbezaan antara servlet dan penapis?

Terdapat beberapa penapis dan mereka memproses permintaan (dan respons) secara berurutan. Mereka digabungkan menjadi rangkaian yang dipanggil - malah terdapat kelas khas untuk mereka FilterChain.

Selepas memproses permintaan dalam kaedah, doFilter()anda perlu memanggil kaedah doFilter()penapis seterusnya dalam rantai. 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 boleh menambah badan tindak balas seperti itu . Secara rasmi, penapis dan servlet adalah bebas antara satu sama lain dan boleh ditukar secara bebas. Ia boleh ditulis oleh pembangun yang berbeza pada masa yang berbeza. Fungsi penapis hanyalah fungsi perkhidmatan, contohnya:

  • Mengelog semua permintaan masuk (dan respons)
  • Pemampatan data
  • Penyulitan (dan penyahsulitan) data
  • Minta Pengesahan Data
  • Tambah/buang pengepala yang diingini
  • Ubah hala permintaan
  • Kawalan akses (menyemak sama ada pengguna telah log masuk)

Kelas RequestDispatcher

doFilter() Kadangkala mungkin perlu memanggil servlet lain semasa penapis sedang berjalan dalam kaedah . Untuk melakukan ini, bekas mempunyai objek khas RequestDispatcher.

Anda boleh mendapatkannya dalam dua cara:

  • Pada objekHttpServletRequest
  • Pada objekServletContext

Objek ini boleh digunakan untuk mengubah hala permintaan sedia ada ke servlet lain . Sebagai contoh, ternyata pengguna tidak dibenarkan dan kami ingin menunjukkan kepadanya halaman dengan kebenaran. Nah, atau terdapat ralat pada pelayan dan kami ingin memaparkan halaman ralat 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 boleh membuat panggilan RequestDispatcherdaripada penapis.

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

Ambil perhatian bahawa permintaan akan dikendalikan dalam kaedah forward()dan tidak perlu memanggil doFilter()selepas digunakan RequestDispatcher.

Perbandingan ubah hala dan ke hadapan

Dan satu lagi perkara penting. Jika anda ingin mengubah hala pengguna ke URI lain dalam servlet anda, maka anda boleh melakukan ini dalam dua cara:

  • redirect
  • forward

Kami telah menganalisisnya, tetapi untuk kemudahan saya akan mengatakannya sekali lagi.

Apabila anda mengubah hala melalui panggilan response.sendRedirect("link"), pelayan menghantar kembali kepada penyemak imbas (klien) jawapan 302dan pautan yang anda tentukan. Dan penyemak imbas, selepas menganalisis respons pelayan, memuat turun pautan yang anda lalui. Iaitu, pautan dalam pelayar bertukar kepada yang baharu.

Jika anda memajukan melalui panggilan requestDispatcher.forward(), maka permintaan baharu dibuat di dalam bekas, dan servlet anda menghantar responsnya kepada penyemak imbas (pelanggan) sebagai respons servlet anda. Dalam kes ini, penyemak imbas menerima respons daripada servlet baharu, tetapi pautan dalam penyemak imbas tidak berubah.

Komen
  • Popular
  • Baru
  • Tua
Anda mesti log masuk untuk meninggalkan ulasan
Halaman ini tidak mempunyai sebarang ulasan lagi