Redirect Servlet vs Maju

1. Gambaran keseluruhan

Kadang-kadang, Pengendali Permintaan HTTP awal di Java Servlet kami perlu menyerahkan Permintaan ke sumber lain. Dalam kes ini, kita boleh meneruskan permintaan lebih jauh atau mengalihkannya ke sumber lain.

Kami akan menggunakan kedua-dua mekanisme tersebut dan membincangkan perbezaan dan amalan terbaik masing-masing.

2. Pergantungan Maven

Pertama, mari tambah pergantungan Servlet Maven:

 javax.servlet javax.servlet-api 4.0.0 

Versi terbaru boleh didapati di sini.

3. Maju

Sekarang mari kita masuk ke kanan dan lihat bagaimana melakukan ke depan yang sederhana:

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

Kami mendapat rujukan RequestDispatcher dari Servlet induk dan mengarahkannya ke sumber pelayan lain.

Ringkasnya, ini akan meneruskan permintaan.

Apabila pelanggan mengemukakan permintaan ke // localhost: 8081 / hello? Name = Dennis , logik ini akan berjalan dan permintaan akan diteruskan ke " / diteruskan ".

4. Ubah hala

Sekarang setelah kita memahami konsep penerusan, mari lihat coretan ringkas untuk mengarahkan:

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

Kami menggunakan objek respons asal untuk mengalihkan permintaan ini ke URL lain : " / dialihkan".

Apabila pelanggan mengemukakan permintaan ke // localhost: 8081 / welcome? Name = Dennis , permintaan tersebut akan dialihkan ke // localhost: 8081 / dialihkan.

Untuk mengetahui lebih lanjut mengenai melakukan pengalihan dalam konteks Spring, lihat artikel khusus kami di sini.

5. Perbezaan

Kami melewati parameter " nama " dengan nilai dalam kedua kes tersebut. Ringkasnya, permintaan yang diteruskan masih membawa nilai ini, tetapi permintaan yang diarahkan tidak.

Ini kerana, dengan pengalihan, objek permintaan berbeza dari objek asal. Sekiranya kita masih mahu menggunakan parameter ini, kita perlu menyimpannya di objek HttpSession .

Berikut adalah senarai perbezaan utama antara servlet forward dan redirect:

Maju :

  • Permintaan akan diproses lebih jauh di sisi pelayan
  • Pelanggan tidak dipengaruhi oleh ke hadapan, URL dalam penyemak imbas tetap sama
  • Objek permintaan dan respons akan tetap menjadi objek yang sama setelah meneruskan. Objek skop permintaan akan tetap tersedia

Ubah hala :

  • Permintaan diarahkan ke sumber yang berbeza
  • Pelanggan akan melihat perubahan URL selepas pengalihan
  • Permintaan baru dibuat
  • Redirect biasanya digunakan dalam corak pengembangan web Post / Redirect / Get

6. Kesimpulannya

Penerusan dan pengalihan adalah mengenai menghantar pengguna ke sumber yang berbeza, walaupun mereka mempunyai semantik yang sangat berbeza.

Memilih antara ini adalah mudah. Sekiranya skop sebelumnya diperlukan, atau pengguna tidak perlu diberitahu, tetapi aplikasi juga ingin melakukan tindakan dalaman, kemudian gunakan penerusan .

Untuk membuang ruang lingkup atau jika kandungan baru tidak dikaitkan dengan permintaan asal - seperti pengalihan ke halaman masuk atau melengkapkan pengiriman borang - kemudian gunakan pengalihan .

Seperti biasa, kod contoh boleh didapati di GitHub.