RequestDispatcher.forward () vs HttpServletResponse.sendRedirect ()


Jawaban:


106

requestDispatcher - forward () metode

  1. Saat kami menggunakan forward metode ini, permintaan ditransfer ke sumber daya lain dalam server yang sama untuk diproses lebih lanjut.

  2. Dalam kasus forward, penampung web menangani semua pemrosesan secara internal dan klien atau browser tidak terlibat.

  3. Ketika forwarddipanggil pada requestDispatcherobjek, kita meneruskan objek request dan respon, jadi objek request lama kita ada di sumber daya baru yang akan memproses permintaan kita.

  4. Secara visual, kami tidak dapat melihat alamat yang diteruskan, ini transparan.

  5. Menggunakan forward()metode ini lebih cepat dari sendRedirect.

  6. Saat kita mengarahkan ulang menggunakan forward, dan kita ingin menggunakan data yang sama di sumber daya baru, kita dapat menggunakan request.setAttribute()karena kita memiliki objek permintaan yang tersedia.

SendRedirect

  1. Dalam kasus sendRedirect, permintaan ditransfer ke sumber daya lain, ke domain lain, atau ke server lain untuk diproses lebih lanjut.

  2. Saat Anda menggunakan sendRedirect , wadah mentransfer permintaan ke klien atau browser, sehingga URL yang diberikan di dalam sendRedirectmetode terlihat sebagai permintaan baru untuk klien.

  3. Dalam kasus sendRedirect panggilan, objek permintaan dan respons lama hilang karena diperlakukan sebagai permintaan baru oleh browser.

  4. Di bilah alamat, kami dapat melihat alamat baru yang dialihkan. Itu tidak transparan.

  5. sendRedirectlebih lambat karena diperlukan satu perjalanan bolak-balik tambahan, karena permintaan yang benar-benar baru dibuat dan objek permintaan yang lama hilang. Diperlukan dua permintaan browser.

  6. Namun sendRedirect, jika kita ingin menggunakan data yang sama untuk sumber daya baru, kita harus menyimpan data dalam sesi atau meneruskan dengan URL.

Mana yang bagus?

Ini tergantung pada skenario metode mana yang lebih berguna.

Jika Anda ingin kontrol adalah transfer ke server atau konteks baru, dan itu diperlakukan sebagai tugas yang benar-benar baru, maka kita pergi sendRedirect. Umumnya, penerusan harus digunakan jika operasi dapat diulangi dengan aman saat browser memuat ulang halaman web dan tidak akan mempengaruhi hasilnya.

Sumber


161

Dalam dunia pengembangan web, istilah "redirect" adalah tindakan mengirimkan klien sebuah respon HTTP kosong hanya dengan sebuah Locationheader yang berisi URL baru dimana klien harus mengirimkan permintaan GET yang baru. Jadi pada dasarnya:

  • Klien mengirimkan permintaan HTTP ke some.jsp .
  • Server mengirimkan respons HTTP kembali dengan Location: other.jspheader
  • Klien mengirim permintaan HTTP ke other.jsp(ini tercermin di bilah alamat browser!)
  • Server mengirimkan respons HTTP kembali dengan konten other.jsp.

Anda dapat melacaknya dengan perangkat pengembang bawaan / addon browser web. Tekan F12 di Chrome / IE9 / Firebug dan periksa bagian "Jaringan" untuk melihatnya.

Persis di atas dicapai oleh sendRedirect("other.jsp"). Tidak RequestDispatcher#forward()mengirim pengalihan. Sebaliknya, ini menggunakan konten halaman target sebagai respons HTTP.

  • Klien mengirimkan permintaan HTTP ke some.jsp .
  • Server mengirimkan respons HTTP kembali dengan konten other.jsp.

Namun, seperti permintaan HTTP asli some.jsp, URL di bilah alamat browser tetap tidak berubah. Selain itu, atribut permintaan apa pun yang disetel di pengontrol belakang some.jspakan tersedia di other.jsp. Ini tidak terjadi selama pengalihan karena Anda pada dasarnya memaksa klien untuk membuat permintaan HTTP baruother.jsp , dengan ini membuang permintaan asli some.jsptermasuk semua atributnya.


Ini RequestDispatchersangat berguna dalam paradigma MVC dan / atau saat Anda ingin menyembunyikan JSP dari akses langsung. Anda dapat meletakkan JSP di /WEB-INFfolder dan menggunakan a Servletyang mengontrol, memproses sebelumnya dan memproses permintaan. JSP di /WEB-INFfolder tidak langsung dapat diakses oleh URL, tetapi Servletdapat mengaksesnya menggunakan RequestDispatcher#forward().

Misalnya, Anda dapat memiliki file JSP di /WEB-INF/login.jspdan LoginServletyang dipetakan pada url-patterndari /login. Saat Anda memanggil http://example.com/context/login, servlet doGet()akan dipanggil. Anda dapat melakukan hal-hal pra- pemrosesan di sana dan akhirnya meneruskan permintaan seperti:

request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);

Saat Anda mengirimkan formulir, Anda biasanya ingin menggunakan POST :

<form action="login" method="post">

Dengan cara ini servlet doPost()akan dipanggil dan Anda dapat melakukan posting apapun proses di sana (misalnya validasi, logika bisnis, login pengguna, dll).

Jika ada kesalahan, biasanya Anda ingin meneruskan permintaan kembali ke halaman yang sama dan menampilkan kesalahan di sana di sebelah kolom masukan dan seterusnya. Anda dapat menggunakanRequestDispatcher untuk ini.

Jika a POSTberhasil, Anda biasanya ingin mengalihkan permintaan, sehingga permintaan tidak akan dikirim kembali saat pengguna menyegarkan permintaan (mis. Menekan F5 atau menavigasi kembali ke riwayat).

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user); // Login user.
    response.sendRedirect("home"); // Redirects to http://example.com/context/home after succesful login.
} else {
    request.setAttribute("error", "Unknown login, please try again."); // Set error.
    request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to same page so that you can display error.
}

Dengan demikian, pengalihan menginstruksikan klien untuk mengaktifkan GETpermintaan baru di URL yang diberikan. Menyegarkan permintaan hanya akan menyegarkan permintaan yang diarahkan ulang dan bukan permintaan awal. Ini akan menghindari "pengiriman ganda" dan kebingungan serta pengalaman pengguna yang buruk. Ini juga disebut POST-Redirect-GETpola .

Lihat juga:


Saat saya mengarahkan dari servlet ke halaman jsp, halaman jsp dimuat sebagian, seperti di stackoverflow.com/questions/12337624/… . Saya ingin hal pertama yang dijalankan ketika ada yang menekan foo.com menjadi servlet. Dari servlet saya melakukan a response.sendRedirect("..")ke halaman index.jsp situs web. Tapi itu melewatkan file css dan beberapa teks dari halaman jsp, menyebabkan pemuatan halaman sebagian. Tetapi ketika saya membuat halaman selamat datang dari situs web menjadi index.jsp, semuanya berfungsi dengan baik dan pemuatan halaman selesai. apa yang salah dengan pengalihan?
SaplingPro

20

The RequestDispatcherantarmuka memungkinkan Anda untuk melakukan sisi server maju / meliputi sedangkan sendRedirect()melakukan redirect sisi klien. Dalam pengalihan sisi klien, server akan mengirimkan kembali kode status HTTP 302(pengalihan sementara) yang menyebabkan browser web mengeluarkan GETpermintaan HTTP baru untuk konten di lokasi yang diarahkan ulang. Sebaliknya, saat menggunakan RequestDispatcherantarmuka, penyertaan / penerusan ke sumber daya baru ditangani sepenuhnya di sisi server.


Dan yang terakhir sebenarnya forward, bukan pengalihan.
Adeel Ansari

5

Perbedaan penting utama antara metode forward () dan sendRedirect () adalah bahwa dalam kasus forward (), pengalihan terjadi di ujung server dan tidak terlihat oleh klien, tetapi dalam kasus sendRedirect (), pengalihan terjadi di ujung klien dan terlihat kepada klien.

masukkan deskripsi gambar di sini


2
Sebuah gambar bernilai ribuan kata :)
Eugen Labun

4

Salah satu dari metode ini mungkin "lebih baik", yaitu lebih cocok, tergantung pada apa yang ingin Anda lakukan.

Pengalihan sisi server lebih cepat sejauh Anda mendapatkan data dari halaman berbeda tanpa melakukan perjalanan bolak-balik ke browser. Tetapi URL yang terlihat di browser masih menggunakan alamat asli, jadi Anda membuat sedikit ketidakkonsistenan di sana.

Pengalihan sisi klien lebih fleksibel sejauh dapat mengirim Anda ke server yang sama sekali berbeda, atau mengubah protokol (misalnya dari HTTP ke HTTPS), atau keduanya. Dan browser mengetahui URL baru. Tetapi dibutuhkan bolak-balik ekstra antara server dan klien.


2
Segmen ini di sini tidak cukup disebutkan di web: "atau ubah protokol (mis. Dari HTTP ke HTTPS), atau keduanya"
Perdomoff

3

SendRedirect()akan mencari konten di antara server. itu lambat karena harus intim browser dengan mengirimkan URL konten. kemudian browser akan membuat permintaan baru untuk konten di dalam server yang sama atau di server lain.

RquestDispatcheradalah untuk mencari konten di dalam server. Ini adalah proses sisi server dan lebih cepat dibandingkan dengan SendRedirect()metode. tetapi masalahnya adalah itu tidak akan mengganggu browser di mana server itu mencari tanggal atau konten yang diperlukan, juga tidak akan meminta browser untuk mengubah URL di tab URL. sehingga menyebabkan sedikit ketidaknyamanan bagi pengguna.


1

Pengalihan teknis harus digunakan baik jika kita perlu mentransfer kontrol ke domain yang berbeda atau untuk mencapai pemisahan tugas.

Misal pada aplikasi pembayaran kita melakukan PaymentProcess terlebih dahulu kemudian redirect ke displayPaymentInfo. Jika klien menyegarkan browser, hanya displayPaymentInfo yang akan dilakukan lagi dan PaymentProcess tidak akan diulang. Namun jika kami menggunakan penerusan dalam skenario ini, PaymentProcess dan displayPaymentInfo akan dijalankan ulang secara berurutan, yang dapat menghasilkan data yang tidak konsisten.

Untuk skenario lain, penerusan efisien untuk digunakan karena lebih cepat daripada sendRedirect


0

Request Dispatcher adalah Antarmuka yang digunakan untuk mengirimkan permintaan atau respons dari sumber daya web ke sumber daya web lain. Ini terutama berisi dua metode.

  1. request.forward(req,res): Metode ini digunakan untuk meneruskan permintaan dari satu sumber daya web ke sumber lain. yaitu dari satu servlet ke servlet lain atau dari satu aplikasi web ke aplikasi web lain.

  2. response.include(req,res): Metode ini digunakan termasuk respon dari satu servlet ke servlet lain

CATATAN: Dengan menggunakan Request Dispatcher kita dapat meneruskan atau menyertakan permintaan atau tanggapan di server yang sama.

request.sendRedirect(): Dengan menggunakan ini kami dapat meneruskan atau menyertakan permintaan atau tanggapan di server yang berbeda. Dalam hal ini klien mendapat intimidasi saat mengarahkan halaman tetapi dalam proses di atas klien tidak akan mendapatkan intimidasi


-1

Cukup perbedaan antara Forward(ServletRequest request, ServletResponse response)dan sendRedirect(String url)adalah

meneruskan():

  1. The forward()Metode dieksekusi di sisi server.
  2. Permintaan tersebut ditransfer ke sumber daya lain dalam server yang sama.
  3. Itu tidak bergantung pada protokol permintaan klien karena forward ()metode ini disediakan oleh wadah servlet.
  4. Permintaan tersebut dibagikan oleh sumber daya target.
  5. Hanya satu panggilan yang dipakai dalam metode ini.
  6. Ini dapat digunakan di dalam server.
  7. Kami tidak dapat melihat pesan yang diteruskan, ini transparan.
  8. The forward()Metode lebih cepat dari sendRedirect()metode.
  9. Itu dideklarasikan di RequestDispatcherantarmuka.

sendRedirect ():

  1. Metode sendRedirect () dijalankan di sisi klien.
  2. Permintaan tersebut ditransfer ke sumber daya lain ke server yang berbeda.
  3. Metode sendRedirect () disediakan di bawah HTTP sehingga hanya dapat digunakan dengan klien HTTP.
  4. Permintaan baru dibuat untuk sumber daya tujuan.
  5. Dua panggilan permintaan dan respons digunakan.
  6. Ini dapat digunakan di dalam dan di luar server.
  7. Kita bisa melihat alamat yang dialihkan, tidak transparan.
  8. Metode sendRedirect () lebih lambat karena ketika permintaan baru dibuat, objek permintaan lama hilang.
  9. Ini dideklarasikan di HttpServletResponse.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.