RequestDispatcher.forward () बनाम HttpServletResponse.sendRedirect ()


जवाबों:


106

requestDispatcher - आगे () विधि

  1. जब हम forwardविधि का उपयोग करते हैं , तो अनुरोध को आगे की प्रक्रिया के लिए उसी सर्वर के भीतर किसी अन्य संसाधन में स्थानांतरित किया जाता है।

  2. के मामले में forward, वेब कंटेनर आंतरिक रूप से सभी प्रसंस्करण को संभालता है और क्लाइंट या ब्राउज़र शामिल नहीं है।

  3. जब ऑब्जेक्ट forwardपर कॉल किया जाता है requestDispatcher, तो हम अनुरोध और प्रतिक्रिया ऑब्जेक्ट पास करते हैं, इसलिए हमारा पुराना अनुरोध ऑब्जेक्ट नए संसाधन पर मौजूद है जो आपके अनुरोध को संसाधित करने जा रहा है।

  4. नेत्रहीन, हम अग्रेषित पते को देखने में सक्षम नहीं हैं, यह पारदर्शी है।

  5. forward()विधि का उपयोग करने से तेज है sendRedirect

  6. जब हम आगे का उपयोग करके रीडायरेक्ट करते हैं, और हम एक नए संसाधन में उसी डेटा का उपयोग करना चाहते हैं, तो हम उपयोग कर सकते हैं request.setAttribute()क्योंकि हमारे पास अनुरोध वस्तु उपलब्ध है।

SendRedirect

  1. के मामले में sendRedirect, अनुरोध को किसी अन्य संसाधन, एक अलग डोमेन, या आगे के प्रसंस्करण के लिए एक अलग सर्वर पर स्थानांतरित किया जाता है।

  2. जब आप उपयोग करते हैं sendRedirect, तो कंटेनर क्लाइंट या ब्राउज़र को अनुरोध स्थानांतरित करता है, इसलिए sendRedirectविधि के अंदर दिया गया URL क्लाइंट के नए अनुरोध के रूप में दिखाई देता है।

  3. sendRedirectकॉल के मामले में , पुराने अनुरोध और प्रतिक्रिया ऑब्जेक्ट खो जाते हैं क्योंकि इसे ब्राउज़र द्वारा नए अनुरोध के रूप में माना जाता है।

  4. एड्रेस बार में, हम नए रीडायरेक्ट किए गए पते को देख पा रहे हैं। यह पारदर्शी नहीं है।

  5. sendRedirectधीमी है क्योंकि एक अतिरिक्त दौर की यात्रा की आवश्यकता है, क्योंकि एक पूरी तरह से नया अनुरोध बनाया गया है और पुरानी अनुरोध वस्तु खो गई है। दो ब्राउज़र अनुरोध आवश्यक हैं।

  6. लेकिन sendRedirect, यदि हम नए संसाधन के लिए उसी डेटा का उपयोग करना चाहते हैं, तो हमें डेटा को सत्र में संग्रहीत करना होगा या URL के साथ पास करना होगा।

कौन सा अच्छा है?

यह इस बात पर निर्भर करता है कि कौन सी विधि अधिक उपयोगी है।

यदि आप चाहते हैं कि नियंत्रण नए सर्वर या संदर्भ में स्थानांतरित हो, और इसे पूरी तरह से नए कार्य के रूप में माना जाता है, तो हम इसके लिए जाते हैं sendRedirect। आमतौर पर, एक फॉरवर्ड का उपयोग किया जाना चाहिए, यदि ऑपरेशन को वेब पेज के ब्राउज़र रीलोड पर सुरक्षित रूप से दोहराया जा सकता है और परिणाम को प्रभावित नहीं करेगा।

स्रोत


161

वेब डेवलपमेंट की दुनिया में, "रीडायरेक्ट" शब्द क्लाइंट को खाली HTTP रिस्पांस भेजने की क्रिया है, जिसमें केवल एक Locationनया URL होता है, जिसमें क्लाइंट को एक नया GET अनुरोध भेजना होता है। तो मूल रूप से:

  • क्लाइंट एक HTTP अनुरोध भेजता है some.jsp
  • Location: other.jspहेडर के साथ सर्वर HTTP प्रतिक्रिया भेजता है
  • क्लाइंट एक HTTP अनुरोध भेजता है other.jsp(यह ब्राउज़र एड्रेस बार में परिलक्षित होता है!)
  • सर्वर एक HTTP प्रतिक्रिया भेजता है जिसकी सामग्री के साथ वापस other.jsp

आप इसे वेब ब्राउजर के बिल्टइन / ऐडऑन डेवलपर टूलसेट से ट्रैक कर सकते हैं। Chrome / IE9 / Firebug में F12 दबाएं और इसे देखने के लिए "नेटवर्क" अनुभाग देखें।

वास्तव में ऊपर से हासिल किया है sendRedirect("other.jsp")RequestDispatcher#forward()एक रीडायरेक्ट नहीं भेजता है। इसके बजाय, यह HTTP प्रतिक्रिया के रूप में लक्ष्य पृष्ठ की सामग्री का उपयोग करता है।

  • क्लाइंट एक HTTP अनुरोध भेजता है some.jsp
  • सर्वर एक HTTP प्रतिक्रिया भेजता है जिसकी सामग्री के साथ वापस other.jsp

हालाँकि, जैसा कि मूल HTTP अनुरोध था some.jsp, ब्राउज़र एड्रेस बार में URL अपरिवर्तित रहता है। इसके अलावा, नियंत्रक के पीछे कोई भी अनुरोध विशेषताएँ some.jspउपलब्ध होंगी other.jsp। यह पुनर्निर्देशित के दौरान नहीं होता है क्योंकि आप मूल रूप से क्लाइंट को एक नया HTTP अनुरोध बनाने के लिए मजबूर कर रहे हैं, जिससे other.jspइसके some.jspसभी एट्रीब्यूट्स सहित मूल अनुरोध को फेंक दिया जाता है।


RequestDispatcherMVC प्रतिमान में अत्यंत उपयोगी है और / या आप JSP के छिपाने के लिए सीधी पहुँच से चाहते हैं। आप JSP के /WEB-INFफ़ोल्डर में रख सकते हैं Servletऔर अनुरोधों को नियंत्रित, प्रीप्रोसेस और पोस्टप्रोसेस का उपयोग कर सकते हैं। /WEB-INFफ़ोल्डर में JSPs सीधे URL द्वारा पहुँच योग्य नहीं हैं, लेकिन Servletउपयोग करके उन्हें एक्सेस कर सकते हैं RequestDispatcher#forward()

उदाहरण के लिए, आपके पास एक JSP फ़ाइल हो सकती है /WEB-INF/login.jspऔर LoginServletजिसमें से एक पर मैप किया जाता url-patternहै /login। जब आप आह्वान करेंगे http://example.com/context/login, तब सर्वलेट का आह्वान doGet()किया जाएगा। आप किसी भी पूर्व प्रसंस्करण सामान को वहां कर सकते हैं और अंत में अनुरोध को आगे बढ़ा सकते हैं:

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

जब आप एक फॉर्म जमा करते हैं, तो आप सामान्य रूप से उपयोग करना चाहते हैं POST:

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

इस तरह सर्वलेट का doPost()आह्वान किया जाएगा और आप किसी भी पोस्ट प्रोसेसिंग सामान को वहां कर सकते हैं (जैसे सत्यापन, व्यावसायिक तर्क, उपयोगकर्ता को लॉगिन करें आदि)।

यदि कोई त्रुटि हो, तो आप सामान्य रूप से करना चाहते हैं आगे एक ही पृष्ठ पर अनुरोध वापस और वहाँ इनपुट फ़ील्ड के बगल में और इतने पर त्रुटियों प्रदर्शित करते हैं। आप इसके लिए उपयोग कर सकते हैं RequestDispatcher

यदि कोई POSTसफल है, तो आप सामान्य रूप से अनुरोध को पुनर्निर्देशित करना चाहते हैं, ताकि जब उपयोगकर्ता अनुरोध को फिर से ताज़ा करे (जैसे कि F5 दबाने या इतिहास में वापस नेविगेट करने पर) अनुरोध फिर से जमा नहीं किया जाएगा।

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

इस प्रकार एक रीडायरेक्ट क्लाइंट को GETदिए गए URL पर एक नए अनुरोध को आग लगाने का निर्देश देता है । अनुरोध को ताज़ा करने पर केवल पुनर्निर्देशित अनुरोध ताज़ा होगा और प्रारंभिक अनुरोध नहीं। यह "डबल सबमिट्स" और भ्रम और बुरे उपयोगकर्ता अनुभवों से बचना होगा। इसे POST-Redirect-GETपैटर्न भी कहा जाता है ।

यह सभी देखें:


जैसा कि मैं एक सर्वलेट से एक jsp पेज पर रीडायरेक्ट करता हूं, jsp पृष्ठ आंशिक रूप से भरा हुआ है, जैसा कि stackoverflow.com/questions/12337624/… में है । मैं चाहता था कि जब कोई भी foo.com हिट हो तो मैं पहली चीज चलाऊं। सर्वलेट से मैं response.sendRedirect("..")वेबसाइट के index.jsp पेज पर आता हूं । लेकिन यह jsp पृष्ठ से सीएसएस फ़ाइलों और कुछ पाठ को याद करता है, जिससे पृष्ठ का आंशिक लोड होता है। लेकिन जब मैं वेबसाइट के स्वागत पृष्ठ को index.jsp बनाता हूं, तो सब कुछ ठीक काम करता है और पेज लोड पूरा हो जाता है। रीडायरेक्ट में क्या गलत है?
सैपलिंगप्रो

20

RequestDispatcherइंटरफेस आप एक सर्वर साइड आगे करने की अनुमति देता / जबकि शामिल sendRedirect()एक ग्राहक के पक्ष रीडायरेक्ट करता है। एक क्लाइंट साइड रीडायरेक्ट में, सर्वर एक HTTP स्टेटस कोड 302(अस्थायी रीडायरेक्ट) को वापस भेज देगा जो वेब ब्राउज़र को GETरीडायरेक्ट किए गए स्थान पर सामग्री के लिए एक नया HTTP अनुरोध जारी करने का कारण बनता है । इसके विपरीत, RequestDispatcherइंटरफ़ेस का उपयोग करते समय , नए संसाधन में शामिल / आगे सर्वर साइड पर पूरी तरह से संभाला जाता है।


और उत्तरार्द्ध वास्तव में है forward, न कि पुनर्निर्देशित।
अदील अंसारी

5

फॉरवर्ड () और सेंडरिडायरेक्ट () विधि के बीच मुख्य महत्वपूर्ण अंतर यह है कि फॉरवर्ड के मामले में (), रीडायरेक्ट सर्वर एंड पर होता है और क्लाइंट को दिखाई नहीं देता है, लेकिन सेंडरिडायरेक्ट () के मामले में, रीडायरेक्ट क्लाइंट एंड पर होता है और यह दिखाई देता है। ग्राहक के लिए।

यहाँ छवि विवरण दर्ज करें


2
एक तस्वीर एक हजार शब्दों के लायक है :)
यूजेन लाबून

4

इन तरीकों में से कोई भी "बेहतर" हो सकता है, यानी अधिक उपयुक्त, जो आप करना चाहते हैं उसके आधार पर।

एक सर्वर-साइड रीडायरेक्ट तेजी से इनोफ़र है क्योंकि आपको ब्राउज़र की एक गोल यात्रा किए बिना एक अलग पृष्ठ से डेटा मिलता है। लेकिन ब्राउज़र में देखा गया URL अभी भी मूल पता है, इसलिए आप वहां थोड़ी असंगतता पैदा कर रहे हैं।

क्लाइंट-साइड रीडायरेक्ट अधिक बहुमुखी इन्सोफ़र है क्योंकि यह आपको पूरी तरह से अलग सर्वर पर भेज सकता है, या प्रोटोकॉल को बदल सकता है (जैसे HTTP से HTTPS), या दोनों। और ब्राउज़र नए URL से अवगत है। लेकिन यह सर्वर और क्लाइंट के बीच एक अतिरिक्त बैक-एंड-आगे ले जाता है।


2
यहाँ इस खंड को वेब पर पर्याप्त उल्लेख नहीं किया गया है: "या प्रोटोकॉल को बदलें (जैसे HTTP से HTTPS को), या दोनों"
Perdomoff

3

SendRedirect()सर्वरों के बीच सामग्री को खोजेगा। यह धीमा है क्योंकि इसमें सामग्री का URL भेजकर ब्राउज़र को अंतरंग करना है। तब ब्राउज़र उसी सर्वर के भीतर या किसी अन्य में सामग्री के लिए एक नया अनुरोध बनाएगा।

RquestDispatcherमुझे लगता है कि सर्वर के भीतर सामग्री की खोज के लिए है। इसकी सर्वर साइड प्रक्रिया है और यह SendRedirect()विधि की तुलना में तेज है । लेकिन बात यह है कि यह उस ब्राउज़र को अंतरंग नहीं करेगा जिस सर्वर में यह आवश्यक दिनांक या सामग्री खोज रहा है, न ही यह ब्राउज़र को URL टैब में URL बदलने के लिए नहीं कहेगा। इसलिए इससे उपयोगकर्ता को थोड़ी असुविधा होती है।


1

यदि हमें अलग-अलग डोमेन पर नियंत्रण स्थानांतरित करने या कार्य को अलग करने की आवश्यकता है, तो तकनीकी रूप से पुनर्निर्देशित किया जाना चाहिए।

उदाहरण के लिए भुगतान एप्लिकेशन में हम पहले भुगतानप्रोसेस करते हैं और फिर प्रदर्शनप्रदर्शन में अनुप्रेषित करते हैं। यदि क्लाइंट केवल ब्राउज़र को रीफ्रेश करता है, तो डिस्प्लेपाइंटइन्फो फिर से किया जाएगा और पेमेंटप्रोसेस को दोहराया नहीं जाएगा। लेकिन अगर हम इस परिदृश्य में आगे का उपयोग करते हैं, तो PaymentProcess और DisplayPaymentInfo दोनों को क्रमिक रूप से फिर से निष्पादित किया जाएगा, जिसके परिणामस्वरूप असंगत डेटा हो सकता है।

अन्य परिदृश्यों के लिए, आगे का उपयोग करने के लिए कुशल है क्योंकि यह sendRedirect की तुलना में तेज़ है


0

अनुरोध डिस्पैचर एक इंटरफ़ेस है जिसका उपयोग वेब संसाधन से दूसरे वेब संसाधन के लिए अनुरोध या प्रतिक्रिया को भेजने के लिए किया जाता है। इसमें मुख्य रूप से दो विधियाँ समाहित हैं।

  1. request.forward(req,res): इस विधि का उपयोग एक वेब संसाधन से दूसरे संसाधन तक अनुरोध को अग्रेषित करने के लिए किया जाता है। यानी एक सर्वलेट से दूसरे सर्वलेट या फिर एक वेब एप्लिकेशन से दूसरी वेब अप्लीकेशन।

  2. response.include(req,res): इस विधि का उपयोग एक सर्वलेट से दूसरे सर्वलेट की प्रतिक्रिया शामिल है

नोट: अनुरोध डिस्पैचर का उपयोग करके हम उसी सर्वर में अनुरोध या प्रतिक्रियाओं को अग्रेषित या शामिल कर सकते हैं।

request.sendRedirect(): इसका उपयोग करके हम विभिन्न सर्वरों के अनुरोध या प्रतिक्रियाओं को अग्रेषित या शामिल कर सकते हैं। इसमें ग्राहक को पृष्ठ को पुनर्निर्देशित करते समय एक सूचना मिल जाती है लेकिन उपरोक्त प्रक्रिया में ग्राहक को सूचना नहीं मिलेगी


-1

बस के बीच अंतर है Forward(ServletRequest request, ServletResponse response)और sendRedirect(String url)है

आगे():

  1. forward()विधि सर्वर साइड में मार डाला गया है।
  2. अनुरोध उसी सर्वर के भीतर अन्य संसाधन में स्थानांतरित किया जाता है।
  3. यह क्लाइंट के अनुरोध प्रोटोकॉल पर निर्भर नहीं करता है क्योंकि forward ()विधि सर्वलेट कंटेनर द्वारा प्रदान की जाती है।
  4. अनुरोध लक्ष्य संसाधन द्वारा साझा किया जाता है।
  5. इस पद्धति में केवल एक कॉल की खपत होती है।
  6. इसे सर्वर के भीतर इस्तेमाल किया जा सकता है।
  7. हम अग्रेषित संदेश नहीं देख सकते, यह पारदर्शी है।
  8. forward()विधि तेजी से है sendRedirect()विधि।
  9. इसे RequestDispatcherइंटरफ़ेस में घोषित किया गया है।

sendRedirect ():

  1. SendRedirect () विधि को क्लाइंट साइड में निष्पादित किया जाता है।
  2. अनुरोध अन्य संसाधन के लिए अलग सर्वर पर स्थानांतरित किया जाता है।
  3. SendRedirect () विधि HTTP के तहत प्रदान की जाती है, इसलिए इसका उपयोग केवल HTTP क्लाइंट के साथ किया जा सकता है।
  4. गंतव्य संसाधन के लिए नया अनुरोध बनाया गया है।
  5. दो अनुरोध और प्रतिक्रिया कॉल का उपभोग किया जाता है।
  6. इसे सर्वर के भीतर और बाहर इस्तेमाल किया जा सकता है।
  7. हम पुनर्निर्देशित पते को देख सकते हैं, यह पारदर्शी नहीं है।
  8. SendRedirect () विधि धीमी है क्योंकि जब नया अनुरोध बनाया जाता है तो पुराने अनुरोध ऑब्जेक्ट खो जाता है।
  9. इसे HttpServletResponse में घोषित किया गया है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.