রিকোয়েস্টডিস্প্যাচার.ফরোয়ার্ড () বনাম এইচটিটিপি সার্ভেলরিসপোনস.সেন্ডারড্রেডেক্ট ()


উত্তর:


106

অনুরোধডিসপাচার - ফরোয়ার্ড () পদ্ধতি

  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

ওয়েব ডেভলপমেন্ট ওয়ার্ল্ডে, "পুনর্নির্দেশ" শব্দটি ক্লায়েন্টকে একটি Locationনতুন ইউআরএল সম্বলিত একটি শিরোনাম দিয়ে খালি এইচটিটিপি প্রতিক্রিয়া পাঠানোর কাজ যা ক্লায়েন্টকে ব্র্যান্ডের নতুন জিইটি অনুরোধ প্রেরণ করতে হবে। সুতরাং মূলত:

  • ক্লায়েন্ট একটি HTTP অনুরোধ প্রেরণ করে some.jsp
  • সার্ভার Location: other.jspশিরোনাম সহ একটি HTTP প্রতিক্রিয়া প্রেরণ করে
  • ক্লায়েন্ট একটি HTTP অনুরোধ প্রেরণ করে other.jsp(এটি ব্রাউজারের অ্যাড্রেস বারে প্রতিফলিত হয়!)
  • সার্ভারের সামগ্রীর সাথে একটি HTTP প্রতিক্রিয়া প্রেরণ করে other.jsp

আপনি ওয়েব ব্রাউজারের বিল্টিন / অ্যাডন বিকাশকারী সরঞ্জামসেট দিয়ে এটি ট্র্যাক করতে পারেন। Chrome / IE9 / ফায়ারব্যাগে F12 টিপুন এবং এটি দেখতে "নেটওয়ার্ক" বিভাগটি দেখুন।

ঠিক উপরের দ্বারা অর্জন করা হয় sendRedirect("other.jsp")RequestDispatcher#forward()একটি পুনঃচালনা পাঠায় না। পরিবর্তে, এটি লক্ষ্য পৃষ্ঠার সামগ্রীটি HTTP প্রতিক্রিয়া হিসাবে ব্যবহার করে।

  • ক্লায়েন্ট একটি HTTP অনুরোধ প্রেরণ করে some.jsp
  • সার্ভারের সামগ্রীর সাথে একটি HTTP প্রতিক্রিয়া প্রেরণ করে other.jsp

যাইহোক, মূল HTTP অনুরোধটি ছিল some.jsp, ব্রাউজারের ঠিকানা বারের URL টি অপরিবর্তিত রয়েছে। এছাড়াও, পিছনে নিয়ামকটিতে নির্ধারিত কোনও অনুরোধের বৈশিষ্ট্যগুলি some.jspউপলব্ধ থাকবে other.jsp। এটি কোনও পুনর্নির্দেশের সময় ঘটে না কারণ আপনি ক্লায়েন্টকে মূলত একটি নতুন এইচটিটিপি অনুরোধ তৈরি করতে বাধ্য করছেন other.jsp, এর মাধ্যমে মূল some.jspবৈশিষ্ট্যটির সমস্ত বৈশিষ্ট্যগুলি অন্তর্ভুক্ত করে ফেলে দিন।


RequestDispatcherMVC দৃষ্টান্ত মধ্যে অত্যন্ত দরকারী এবং / অথবা আপনি JSP এর আড়াল থেকে সরাসরি প্রবেশাধিকার কাছ থেকে কি চান না। আপনি জেএসপি'র /WEB-INFফোল্ডারে রাখতে পারেন Servletএবং অনুরোধগুলি নিয়ন্ত্রণ, প্রাক প্রসেস এবং পোস্টপ্রসেসগুলি ব্যবহার করতে পারেন । /WEB-INFফোল্ডারে থাকা জেএসপিগুলি ইউআরএল দ্বারা সরাসরি অ্যাক্সেসযোগ্য নয় তবে 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 পৃষ্ঠাটি আংশিকভাবে লোড করা হবে, স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 12337624/… হিসাবে । আমি চাইছিলাম যে কেউ যখন foo.com হিট করে সার্লেট হয়ে যায় তখন প্রথম জিনিসটি চালানো উচিত। সার্ভলেট থেকে আমি response.sendRedirect("..")ওয়েবসাইটের index.jsp পৃষ্ঠায় একটি করি । তবে এটি CSS ফাইল এবং jsp পৃষ্ঠা থেকে কিছু পাঠ্য মিস করে যা পৃষ্ঠার আংশিক লোডের দিকে নিয়ে যায়। তবে যখন আমি ওয়েবসাইটটির স্বাগত পৃষ্ঠাটি index.jsp হিসাবে তৈরি করি তখন সমস্ত কিছুই সূক্ষ্মভাবে কাজ করে এবং পৃষ্ঠাগুলি সম্পূর্ণ হয়। পুনর্নির্দেশে কি ভুল?
saplingPro

20

RequestDispatcherইন্টারফেস আপনাকে একটি সার্ভার সাইড এগিয়ে করার অনুমতি দিয়েছে / যেহেতু অন্তর্ভুক্ত sendRedirect()একটি ক্লায়েন্ট সাইড পুনর্নির্দেশ আছে। কোনও ক্লায়েন্টের দিকনির্দেশে সার্ভারটি একটি HTTP স্থিতি কোডটি 302(অস্থায়ী পুনঃনির্দেশ) ফেরত পাঠাবে যার ফলে ওয়েব ব্রাউজারটি GETপুনঃনির্দেশিত স্থানে সামগ্রীর জন্য একটি নতুন HTTP অনুরোধ জারি করে । বিপরীতে, RequestDispatcherইন্টারফেসটি ব্যবহার করার সময়, নতুন সংস্থানটিতে অন্তর্ভুক্ত / ফরোয়ার্ডগুলি পুরোপুরি সার্ভারের দিকে পরিচালিত হয়।


এবং পরেরটি আসলে forward, পুনর্নির্দেশ নয়।
আদিল আনসারী

5

ফরোয়ার্ড () এবং সেন্ডরেডাইরেক্ট () পদ্ধতির মধ্যে প্রধান গুরুত্বপূর্ণ পার্থক্যটি হ'ল ফরোয়ার্ডের ক্ষেত্রে (), সার্ভারের শেষে পুনর্নির্দেশ ঘটে এবং ক্লায়েন্টের কাছে দৃশ্যমান হয় না, তবে সেন্ডরাইডারেক্ট () এর ক্ষেত্রে ক্লায়েন্টের শেষে পুনর্নির্দেশ ঘটে এবং এটি দৃশ্যমান ক্লায়েন্ট।

এখানে চিত্র বর্ণনা লিখুন


2
একটি ছবি হাজার শব্দের মূল্যবান :)
ইউজেন লাবুন

4

আপনি যা করতে চান তার উপর নির্ভর করে এই পদ্ধতির যে কোনও একটি হতে পারে "আরও ভাল", অর্থাত্ আরও উপযুক্ত।

ব্রাউজারে কোনও গোল ভ্রমণ না করেই কোনও ভিন্ন পৃষ্ঠা থেকে ডেটা পাওয়ার সাথে সাথে একটি সার্ভার-সাইড পুনর্নির্দেশ দ্রুততর হয় ar তবে ব্রাউজারে দেখা URL টি এখনও মূল ঠিকানা, তাই আপনি সেখানে কিছুটা অসঙ্গতি তৈরি করছেন।

কোনও ক্লায়েন্ট-সাইড পুনর্নির্দেশ হ'ল আরও বহুমুখী ইনসোফার কারণ এটি আপনাকে সম্পূর্ণ আলাদা সার্ভারে প্রেরণ করতে পারে বা প্রোটোকল পরিবর্তন করতে পারে (যেমন HTTP থেকে HTTPS এ), বা উভয়ই। এবং ব্রাউজারটি নতুন ইউআরএল সম্পর্কে সচেতন। তবে এটি সার্ভার এবং ক্লায়েন্টের মধ্যে একটি অতিরিক্ত পিছনে।


2
এই বিভাগটিতে ঠিক এখানে ওয়েবে উল্লেখ করা হয়নি: "বা প্রোটোকল পরিবর্তন করুন (যেমন HTTP থেকে এইচটিটিপিএসে), বা উভয়ই"
প্যারডমফ

3

SendRedirect()সার্ভারগুলির মধ্যে সামগ্রীটি অনুসন্ধান করবে। এটি ধীর কারণ এটি সামগ্রীর URL টি প্রেরণ করে ব্রাউজারকে অন্তরঙ্গ করতে হয়। তারপরে ব্রাউজার একই সার্ভারের মধ্যে বা অন্য একটিতে সামগ্রীর জন্য একটি নতুন অনুরোধ তৈরি করবে।

RquestDispatcherআমি মনে করি যে সার্ভারের মধ্যে থাকা সামগ্রীটি অনুসন্ধান করার জন্য। এটি সার্ভার সাইড প্রক্রিয়া এবং এটি দ্রুত SendRedirect()পদ্ধতির সাথে তুলনা করে । তবে বিষয়টি হ'ল এটি ব্রাউজারকে অন্তর্নিহিত করবে না যে সার্ভারে এটি প্রয়োজনীয় তারিখ বা বিষয়বস্তু অনুসন্ধান করছে, না ব্রাউজারকে ইউআরএল ট্যাবে URL টি পরিবর্তন করতে বলবে না। সুতরাং এটি ব্যবহারকারীর সামান্য অসুবিধার কারণ হয়।


1

আমাদের যদি অন্য ডোমেনে নিয়ন্ত্রণ স্থানান্তর করতে হয় বা টাস্কের বিচ্ছেদ অর্জন করতে হয় তবে প্রযুক্তিগতভাবে পুনঃনির্দেশ ব্যবহার করা উচিত।

উদাহরণস্বরূপ অর্থ প্রদানের অ্যাপ্লিকেশনটিতে আমরা প্রথমে পেমেন্টপ্রসেস করি এবং তারপরে ডিসপ্লেপেইমেন্টআইএনফোতে পুনঃনির্দেশ করি। যদি ক্লায়েন্ট ব্রাউজারটি রিফ্রেশ করে তবে কেবল ডিসপ্লে পেমেন্টইনফো হয়ে যাবে এবং পেমেন্টপ্রসেসের পুনরাবৃত্তি হবে না। তবে আমরা যদি এই দৃশ্যে এগিয়ে ব্যবহার করি, পেমেন্টপ্রসেস এবং ডিসপ্লে পেমেন্টআইএনফো উভয়ই ধারাবাহিকভাবে পুনরায় সম্পাদন করা হবে যার ফলস্বরূপ অসংলগ্ন ডেটা হতে পারে।

অন্যান্য দৃশ্যের জন্য, ফরোয়ার্ডটি ব্যবহারে দক্ষ কারণ এটি প্রেরণ-নির্দেশিকার চেয়ে দ্রুত


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. প্রেরণাদীক্ষা () পদ্ধতিটি ক্লায়েন্টের পক্ষে কার্যকর করা হয়।
  2. অনুরোধটি অন্য সার্ভারে বিভিন্ন সার্ভারে স্থানান্তর করা হয়।
  3. প্রেরণাদীক্ষা () পদ্ধতিটি HTTP এর অধীনে সরবরাহ করা হয় যাতে এটি কেবল এইচটিটিপি ক্লায়েন্টের সাথেই ব্যবহার করা যায়।
  4. গন্তব্য সংস্থান জন্য নতুন অনুরোধ তৈরি করা হয়।
  5. দুটি অনুরোধ এবং প্রতিক্রিয়া কল গ্রহণ করা হয়।
  6. এটি সার্ভারের মধ্যে এবং বাইরে ব্যবহার করা যেতে পারে।
  7. আমরা পুনঃনির্দেশিত ঠিকানা দেখতে পারি, এটি স্বচ্ছ নয়।
  8. প্রেরণ-প্রত্যক্ষ () পদ্ধতিটি ধীরে ধীরে কারণ যখন নতুন অনুরোধ তৈরি করা হয় তখন পুরানো অনুরোধ অবজেক্টটি হারিয়ে যায়।
  9. এটি HttpServletResponse এ ঘোষণা করা হয়েছে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.