Pengalihan Servlet vs Teruskan

1. Ikhtisar

Kadang-kadang, HTTP Request Handler awal di Servlet Java kita perlu mendelegasikan Request ke sumber lain. Dalam kasus ini, kami dapat meneruskan permintaan lebih lanjut atau mengalihkannya ke sumber daya yang berbeda.

Kami akan menggunakan kedua mekanisme tersebut dan membahas perbedaan serta praktik terbaik masing-masing.

2. Ketergantungan Maven

Pertama, mari tambahkan dependensi Servlet Maven:

 javax.servlet javax.servlet-api 4.0.0 

Versi terbaru dapat ditemukan di sini.

3. Teruskan

Sekarang mari kita langsung masuk dan melihat bagaimana melakukan forward sederhana:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) { RequestDispatcher dispatcher = getServletContext() .getRequestDispatcher("/forwarded"); dispatcher.forward(req, resp); }

Kami mendapatkan referensi RequestDispatcher dari Servlet induk dan mengarahkannya ke sumber daya server lain.

Sederhananya, ini akan meneruskan permintaan.

Ketika klien mengirimkan permintaan ke // localhost: 8081 / hello? Name = Dennis , logika ini akan berjalan dan permintaan akan diteruskan ke “ / diteruskan “.

4. Alihkan

Sekarang setelah kita memahami konsep penerusan, mari kita lihat cuplikan cepat untuk pengalihan:

protected void doGet(HttpServletRequest req, HttpServletResponse resp){ resp.sendRedirect(req.getContextPath() + "/redirected"); } 

Kami menggunakan objek respons asli untuk mengarahkan permintaan ini ke URL lain : " / redirected".

Ketika klien mengirimkan permintaan ke // localhost: 8081 / welcome? Name = Dennis , permintaan tersebut akan dialihkan ke // localhost: 8081 / redirected.

Untuk mengetahui lebih lanjut tentang melakukan pengalihan dalam konteks Musim Semi, lihat artikel khusus kami di sini.

5. Perbedaan

Kami mengirimkan parameter " nama " dengan nilai di kedua kasus. Sederhananya, permintaan yang diteruskan masih memiliki nilai ini, tetapi permintaan yang dialihkan tidak.

Ini karena, dengan pengalihan, objek permintaan berbeda dari yang asli. Jika kita masih ingin menggunakan parameter ini, kita perlu menyimpannya di objek HttpSession .

Berikut adalah daftar perbedaan utama antara servlet forward dan redirect:

Maju :

  • Permintaan tersebut akan diproses lebih lanjut di sisi server
  • Klien tidak terpengaruh oleh penerusan, URL di browser tetap sama
  • Objek permintaan dan respons akan tetap menjadi objek yang sama setelah diteruskan. Objek cakupan permintaan akan tetap tersedia

Alihkan :

  • Permintaan dialihkan ke sumber daya yang berbeda
  • Klien akan melihat URL berubah setelah pengalihan
  • Permintaan baru dibuat
  • Redirect biasanya digunakan dalam pola pengembangan web Post / Redirect / Get

6. Kesimpulan

Penerusan dan pengalihan keduanya tentang mengirim pengguna ke sumber daya yang berbeda, meskipun mereka memiliki semantik yang sangat berbeda.

Memilih di antara ini sederhana. Jika cakupan sebelumnya diperlukan, atau pengguna tidak perlu diinformasikan, tetapi aplikasi juga ingin melakukan tindakan internal, gunakan penerusan .

Untuk membuang ruang lingkup atau jika konten baru tidak terkait dengan permintaan asli - seperti pengalihan ke halaman login atau menyelesaikan pengiriman formulir - maka gunakan pengalihan .

Seperti biasa, kode contoh dapat ditemukan di GitHub.