RequestDispatcher.forward () ve HttpServletResponse.sendRedirect ()


Yanıtlar:


106

requestDispatcher - forward () yöntemi

  1. forwardYöntemi kullandığımızda, talep daha fazla işlenmek üzere aynı sunucu içindeki başka bir kaynağa aktarılır.

  2. Bu durumda forward, web kapsayıcısı tüm işlemleri dahili olarak gerçekleştirir ve istemci veya tarayıcı dahil değildir.

  3. Ne zaman forwardüzerinde çağrıldığında requestDispatchernesnenin bizim eski istek nesnesi bizim isteği işlemek için gidiyor yeni kaynakta mevcut olduğu, bu yüzden biz, istek ve yanıt nesneleri geçmektedir.

  4. Görsel olarak iletilen adresi göremiyoruz, şeffaf.

  5. forward()Yöntemi kullanmak daha hızlıdır sendRedirect.

  6. Forward kullanarak yeniden yönlendirdiğimizde ve aynı verileri yeni bir kaynakta kullanmak istediğimizde, kullanılabilir request.setAttribute()bir istek nesnemiz olduğu için kullanabiliriz.

SendRedirect

  1. Durumda sendRedirect, talep başka bir kaynağa, farklı bir alana veya daha fazla işlem için farklı bir sunucuya aktarılır.

  2. Kullandığınızda sendRedirect, konteyner, isteği istemciye veya tarayıcıya aktarır, böylece sendRedirectyöntem içinde verilen URL , istemciye yeni bir istek olarak görünür.

  3. sendRedirectÇağrı durumunda , tarayıcı tarafından yeni istek olarak değerlendirildiği için eski istek ve yanıt nesneleri kaybolur.

  4. Adres çubuğunda, yeni yönlendirilen adresi görebiliriz. Şeffaf değil.

  5. sendRedirectdaha yavaştır çünkü fazladan bir gidiş dönüş gereklidir, çünkü tamamen yeni bir istek yaratılır ve eski istek nesnesi kaybolur. İki tarayıcı isteği gereklidir.

  6. Ancak içinde sendRedirect, aynı verileri yeni bir kaynak için kullanmak istiyorsak, verileri oturumda saklamamız veya URL ile birlikte iletmemiz gerekir.

Hangisi iyi?

Hangi yöntemin daha kullanışlı olduğu senaryoya bağlıdır.

Kontrolün yeni sunucuya veya içeriğe aktarılmasını istiyorsanız ve tamamen yeni bir görev olarak kabul edilirse, o zaman gidiyoruz sendRedirect. Genel olarak, tarayıcı web sayfasının yeniden yüklenmesi üzerine işlem güvenli bir şekilde tekrarlanabiliyorsa ve sonucu etkilemiyorsa bir yönlendirme kullanılmalıdır.

Kaynak


161

Web geliştirme dünyasında, "yeniden yönlendirme" terimi Location, istemciye yepyeni bir GET isteği göndermesi gereken yeni URL'yi içeren bir başlıkla boş bir HTTP yanıtı gönderme eylemidir . Yani temelde:

  • İstemci, adresine bir HTTP isteği gönderir some.jsp.
  • Sunucu, Location: other.jspbaşlığa sahip bir HTTP yanıtı gönderir
  • İstemci adresine bir HTTP isteği gönderir other.jsp(bu, tarayıcı adres çubuğuna yansıtılır!)
  • Sunucu, içeriğiyle bir HTTP yanıtı gönderir other.jsp.

Bunu web tarayıcısının yerleşik / eklenti geliştirici araç setiyle izleyebilirsiniz. Chrome / IE9 / Firebug'da F12'ye basın ve görmek için "Ağ" bölümünü kontrol edin.

Tam olarak yukarıdaki ile elde edilir sendRedirect("other.jsp"). RequestDispatcher#forward()Bir yönlendirme göndermez. Bunun yerine, hedef sayfanın içeriğini HTTP yanıtı olarak kullanır.

  • İstemci, adresine bir HTTP isteği gönderir some.jsp.
  • Sunucu, içeriğiyle bir HTTP yanıtı gönderir other.jsp.

Ancak, orijinal HTTP isteği olduğu gibi some.jsp, tarayıcı adres çubuğundaki URL değişmeden kalır. Ayrıca, arkadaki denetleyicide ayarlanan tüm istek öznitelikleri içinde some.jspmevcut olacaktır other.jsp. Bu, bir yönlendirme sırasında olmaz, çünkü temelde istemciyi üzerinde yeni bir HTTP isteği oluşturmaya zorlarsınız, böylece tüm özniteliklerini içeren other.jsporijinal isteği some.jspatarsınız.


RequestDispatcherMVC paradigma son derece yararlıdır ve / veya JSP doğrudan erişimden gizlemek istediğinizde. JSP'leri /WEB-INFklasöre koyabilir Servletve istekleri kontrol eden, ön işleyen ve son işleyen bir kullanabilirsiniz . /WEB-INFKlasördeki JSP'lere URL ile doğrudan erişilemez, ancak Servletbunlara kullanılarak erişilebilir RequestDispatcher#forward().

Örneğin bir JSP dosyayı olabilir /WEB-INF/login.jspve bir LoginServletbir üzerine eşleştirilir url-patternarasında /login. Çağırdığınızda http://example.com/context/login, sunucu doGet()uygulaması çağrılacaktır. Orada herhangi bir ön işleme işlemi yapabilir ve son olarak isteği şu şekilde iletebilirsiniz :

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

Bir form gönderirken normalde kullanmak istersiniz POST:

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

Bu şekilde sunucu doPost()uygulaması çağrılır ve orada herhangi bir işlem sonrası işlemi yapabilirsiniz (örn. Doğrulama, iş mantığı, kullanıcının oturum açma vb.).

Herhangi bir hata varsa, normalde isteği aynı sayfaya geri iletmek ve giriş alanlarının yanında hataları görüntülemek ve bu şekilde devam etmek istersiniz . Bunun için kullanabilirsiniz RequestDispatcher.

Bir POSTbaşarılı olursa, normalde isteği yeniden yönlendirmek istersiniz , böylece kullanıcı isteği yenilediğinde (örn. F5'e basarak veya geçmişte geri döndüğünde) istek yeniden gönderilmez.

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.
}

Böylelikle bir yönlendirme , müşteriye GETverilen URL'de yeni bir istek başlatması talimatını verir . İsteğin yenilenmesi, ilk isteği değil, yalnızca yeniden yönlendirilen isteği yeniler. Bu, "çift gönderimleri" ve kafa karışıklığını ve kötü kullanıcı deneyimlerini önleyecektir. Buna POST-Redirect-GETdesen de denir .

Ayrıca bakınız:


Bir sunucu uygulamasından bir jsp sayfasına yönlendirdiğimde, stackoverflow.com/questions/12337624/… 'de olduğu gibi jsp sayfası kısmen yükleniyor . Herhangi biri foo.com'a tıkladığında ilk şeyin sunucu uygulaması olmasını istedim . response.sendRedirect("..")Sunucu uygulamasından web sitesinin index.jsp sayfasına bir yapıyorum . Ancak bu, css dosyalarını ve jsp sayfasındaki bazı metinleri gözden kaçırarak sayfanın kısmi yüklenmesine yol açar. Ancak web sitesinin karşılama sayfasını index.jsp yaptığımda, her şey yolunda gidiyor ve sayfa yüklemeleri tamamlanıyor. yönlendirmeyle ilgili sorun nedir?
fidanPro

20

RequestDispatcherArayüzü ileri bir sunucu tarafı yapmak için izin verir / oysa dahil sendRedirect()istemci taraflı yönlendirme yapar. İstemci tarafı yeniden yönlendirmede, sunucu 302, web tarayıcısının GETyeniden yönlendirilen konumdaki içerik için yepyeni bir HTTP isteği göndermesine neden olan bir HTTP durum kodunu (geçici yeniden yönlendirme) geri gönderir . Bunun tersine, RequestDispatcherarayüzü kullanırken, yeni kaynağa dahil etme / yönlendirme tamamen sunucu tarafında işlenir.


Ve ikincisi aslında forwardyönlendirme değil.
Adeel Ansari

5

Forward () ve sendRedirect () yöntemi arasındaki temel önemli fark, forward () durumunda, yönlendirmenin sunucu tarafında gerçekleşmesi ve istemciye görünmemesidir, ancak sendRedirect () durumunda, yönlendirme istemci tarafında gerçekleşir ve görünür müşteriye.

görüntü açıklamasını buraya girin


2
Bir resim bin kelimeye bedeldir :)
Eugen Labun

4

Ne yapmak istediğinize bağlı olarak bu yöntemlerden herhangi biri "daha iyi", yani daha uygun olabilir.

Tarayıcıya gidiş-dönüş yapmadan farklı bir sayfadan verileri aldığınız sürece, sunucu tarafı yeniden yönlendirme daha hızlıdır. Ancak tarayıcıda görülen URL hala orijinal adrestir, bu yüzden orada biraz tutarsızlık yaratıyorsunuz.

İstemci tarafı yeniden yönlendirme, sizi tamamen farklı bir sunucuya gönderebildiği veya protokolü değiştirebildiği (örneğin HTTP'den HTTPS'ye) veya her ikisini birden değiştirebildiği sürece daha çok yönlüdür. Ve tarayıcı yeni URL’nin farkındadır. Ancak sunucu ve istemci arasında fazladan bir ileri geri gitme gerektirir.


2
Bu bölüm web'de yeterince bahsedilmiyor: "veya protokolü değiştirin (ör. HTTP'den HTTPS'ye) veya her ikisini birden değiştirin"
Perdomoff

3

SendRedirect()içeriği sunucular arasında arayacaktır. yavaştır çünkü içeriğin URL'sini göndererek tarayıcıya yakınlaşması gerekir. daha sonra tarayıcı aynı sunucudaki veya başka bir sunucudaki içerik için yeni bir istek oluşturacaktır.

RquestDispatchersanırım sunucu içindeki içeriği aramak içindir. bu, sunucu tarafı işlemidir ve SendRedirect()yönteme göre daha hızlıdır . ama mesele şu ki, gerekli tarih veya içeriği aradığı sunucuda tarayıcıya yakınlık göstermeyecek, tarayıcıdan URL sekmesindeki URL'yi değiştirmesini de istemeyecek. bu nedenle kullanıcıya çok az rahatsızlık verir.


1

Kontrolü farklı bir etki alanına aktarmamız gerekirse veya görevlerin ayrılmasını sağlamak için teknik olarak yeniden yönlendirme kullanılmalıdır.

Örneğin, ödeme uygulamasında, önce Ödeme İşlemini yaparız ve ardından displayPaymentInfo'ya yönlendiririz. İstemci tarayıcıyı yenilerse, yalnızca displayPaymentInfo tekrar yapılacak ve PaymentProcess tekrarlanmayacaktır. Ancak bu senaryoda ileriye doğru kullanırsak, hem PaymentProcess hem de displayPaymentInfo sıralı olarak yeniden çalıştırılır ve bu da tutarsız verilere neden olabilir.

Diğer senaryolar için, sendRedirect'ten daha hızlı olduğu için forward kullanımı etkilidir.


0

İstek Dağıtıcı, isteği veya yanıtı web kaynağından başka bir web kaynağına göndermek için kullanılan bir Arayüzdür. Esas olarak iki yöntem içerir.

  1. request.forward(req,res): Bu yöntem, isteği bir web kaynağından başka bir kaynağa iletmek için kullanılır. yani bir sunucu uygulamasından başka bir sunucu uygulamasına veya bir web uygulamasından başka bir web uygulamasına.

  2. response.include(req,res): Bu yöntem, bir sunucu uygulamasının başka bir sunucu uygulamasına yanıtını içerir

NOT: Request Dispatcher'ı kullanarak, isteği veya yanıtları aynı sunucuda yönlendirebilir veya dahil edebiliriz.

request.sendRedirect(): Bunu kullanarak, isteği veya yanıtları farklı sunucular arasında iletebilir veya dahil edebiliriz. Bu durumda müşteri sayfayı yeniden yönlendirirken bir intimation alır, ancak yukarıdaki süreçte müşteri intimasyon almaz.


-1

Basitçe arasındaki fark Forward(ServletRequest request, ServletResponse response)ve sendRedirect(String url)bir

) (İleri:

  1. forward()Yöntem, sunucu tarafında yürütülür.
  2. İstek, aynı sunucu içindeki başka bir kaynağa aktarılır.
  3. forward ()Yöntem, sunucu uygulaması kapsayıcısı tarafından sağlandığından , istemcinin istek protokolüne bağlı değildir .
  4. İstek, hedef kaynak tarafından paylaşılır.
  5. Bu yöntemde yalnızca bir çağrı kullanılır.
  6. Sunucu içerisinde kullanılabilir.
  7. İletilen mesajı göremiyoruz, şeffaftır.
  8. forward()Yöntemi daha hızlı daha sendRedirect()yöntemle.
  9. RequestDispatcherArayüzde beyan edilir .

sendRedirect ():

  1. SendRedirect () yöntemi, istemci tarafında yürütülür.
  2. İstek, başka bir kaynağa farklı bir sunucuya aktarılır.
  3. SendRedirect () yöntemi HTTP altında sağlanır, bu nedenle yalnızca HTTP istemcileriyle kullanılabilir.
  4. Hedef kaynak için yeni istek yaratılır.
  5. İki istek ve yanıt çağrısı tüketilir.
  6. Sunucu içinde ve dışında kullanılabilir.
  7. Yönlendirilen adresi görebiliriz, şeffaf değildir.
  8. SendRedirect () yöntemi daha yavaştır çünkü yeni istek oluşturulduğunda eski istek nesnesi kaybolur.
  9. HttpServletResponse'de bildirilmiştir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.