কীভাবে jQuery ব্যবহার করে পুনঃনির্দেশগুলি অনুসরণ করার জন্য অজ্যাক্স অনুরোধগুলি রোধ করবেন


102

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

উদাহরণ: একটি অনুরোধ কিছু URL এ যায় যা পাওয়া যায় না, তাই আমি 302 অন্য কোনও জায়গায় পুনর্নির্দেশ পাই। একটি নতুন অনুরোধ প্রেরণ করা হয়েছে, এবং আমি 200 টি ঠিক আছে, এভাবে ত্রুটি কলব্যাকটিকে আগুনে আটকাতে পারি।

পুনঃনির্দেশগুলি অনুসরণ করার জন্য এজ্যাক্স অনুরোধটি আটকাতে এবং এর পরিবর্তে একটি কলব্যাক, বিশেষত ত্রুটি পদ্ধতিটি প্রার্থনা করার কোনও উপায় আছে কি? বিকল্পভাবে, ক্লায়েন্টে পুনর্নির্দেশ ঘটেছে কিনা তা সনাক্ত করা সম্ভব?


এই সাহায্য করতে পারে: stackoverflow.com/questions/1804928/handle-jquery-ajax-redirect
PiTheNumber

8
এটি অদ্ভুত যে আপনার ব্যাকএন্ডে 404 এর পরিবর্তে পাওয়া যায় না বলে 302 প্রতিবেদন করা হচ্ছে
জেক ফ্যাসেল

উত্তর:


96

আপনার প্রশ্নটি আমি আকর্ষণীয় মনে করি তবে পুরো সমস্যাটি আমাকে আরও ভুল বোঝাবুঝি বলে মনে হয়। কমপক্ষে আমি আমার সমস্যাটি বোঝার চেষ্টা করব।

নিঃশব্দ (স্বচ্ছ) পুনর্নির্দেশকরণ XMLHttpRequestনির্দিষ্টকরণের অংশ ( এখানে বিশেষত শব্দগুলি দেখুন ... "স্বচ্ছভাবে পুনঃনির্দেশটি অনুসরণ করুন ...")। স্ট্যান্ডার্ডটিতে কেবল উল্লেখ করা হয়েছে যে ব্যবহারকারী এজেন্ট (ওয়েব ব্রাউজার) নির্দিষ্ট ধরণের স্বয়ংক্রিয় পুনঃনির্দেশগুলি প্রতিরোধ বা অবহিত করতে পারে তবে এটি এর অংশ নয় XMLHttpRequest। এটি HTTP ক্লায়েন্ট কনফিগারেশন (ওএস কনফিগারেশন) বা ওয়েব ব্রাউজার কনফিগারেশনের অংশ। সুতরাং jQuery.ajaxএমন কোনও বিকল্প থাকতে পারে না যেখানে আপনি পুনঃনির্দেশকে আটকাতে পারবেন।

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

যোগাযোগের সময় আপনি ওয়েব সার্ভারের আইপি ঠিকানা পরিবর্তন বা আইপি রুটের পরিবর্তন রোধ করতে আপনার প্রশ্ন থেকে প্রয়োজনীয়তার তুলনা করতে পারেন compare সব কিছুই কিছু পরিস্থিতিতে আকর্ষণীয় হতে পারে, কিন্তু সেখানে অংশ আছে যোগাযোগ স্ট্যাক আরেকটি স্তর এবং দ্বারা পরিচালিত করা যাবে না jQuery.ajaxবা XMLHttpRequest

XMLHttpRequestমান বলে ক্লায়েন্ট কনফিগারেশন অপশন যা ফেরৎ প্রতিরোধ থাকতে পারে। "মাইক্রোসফ্ট ওয়ার্ল্ড" এর ক্ষেত্রে, যা আমি আরও ভাল করে জানি, আপনি WinHttpSetOption ফাংশনটি দেখতে পারেন যা মান WINHTTP_OPTION_DISABLE_FEATUREসহ বিকল্প সেট করতে ব্যবহার করা যেতে পারে WINHTTP_DISABLE_REDIRECTS। আর একটি উপায় হ'ল মান WINHTTP_OPTION_REDIRECT_POLICYসহ বিকল্পের ব্যবহার WINHTTP_OPTION_REDIRECT_POLICY_NEVER। উইন্ডোজে ব্যবহার করা যায় এমন আরও একটি বৈশিষ্ট্য হ'ল উইনহট্টপসেটস্ট্যাটাসক্যালব্যাক ফাংশন যা কলব্যাক ফাংশন সেট করতে পারে কিছু নোটিফিকেশন পেয়েছে WINHTTP_CALLBACK_FLAG_REDIRECT

সুতরাং আপনার প্রয়োজনীয়তাগুলি সাধারণভাবে প্রয়োগ করা সম্ভব, তবে সমাধান সম্ভবত অপারেশন সিস্টেম বা ওয়েব ব্রাউজার থেকে স্বতন্ত্র হবে না এবং jQuery.ajaxবা এর স্তরে নয় XMLHttpRequest


2
দুর্দান্ত অন্তর্দৃষ্টি দিয়ে দুর্দান্ত উত্তর! কার্ল নিয়ে আমার কিছু অভিজ্ঞতা আছে, যার জন্য আপনি উল্লিখিত হিসাবে অনুরূপ পতাকা সেট করতে পারেন। আমি আশা করছিলাম যে এই জাতীয় নির্দেশাবলী ব্রাউজারে প্রেরণ করা যেতে পারে তবে আপনার উত্তর থেকে, আমি বুঝতে পারি যে প্রত্যাশিত আচরণটি পুনর্নির্দেশগুলি অনুসরণ করা হবে যেমন সার্ভারের দ্বারা নির্ধারিত স্থানে প্রাথমিক অনুরোধ প্রেরণ করা হয়েছিল।
জর্জেন

@ জারজেন: আপনাকে স্বাগতম! সর্বাধিক পরিস্থিতিতে পুনর্নির্দেশটি কোনও সমস্যা নয়। আপনি jQuery.ajax ব্যবহার করেন সেই প্রসঙ্গে এবং আপনি যে ওয়েব সার্ভারটিতে অনুরোধটি প্রেরণ করেছেন তাতে আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে কিনা তা আপনি বর্ণনা করেন না। সুতরাং আপনাকে অন্যান্য পরামর্শ দেওয়া কঠিন যা সত্যই আপনার সমস্যার সমাধান করতে পারে।
ওলেগ

আমি সার্ভারের দিকটি নিয়ন্ত্রণ করি না, আমি ভয় করি। আমি অনুমান করি যে আমার সর্বোত্তম বিকল্পটি প্রতিক্রিয়া সামগ্রীটি বিশ্লেষণ বা যাচাই করা।
জর্জেন

@ জারজেন: আপনার ক্ষেত্রে পুনঃনির্দেশ কেন একটি সমস্যা? যদি সার্ভারটি কোনও পৃষ্ঠা অস্থায়ী বা স্থায়ীভাবে অন্য কোনও স্থানে সরিয়ে নিয়ে যায় তবে এটি আপনার মূল অনুরোধটিকে নতুন জায়গায় পুনর্নির্দেশ করতে পারে। এটা একদম ঠিক আছে। কোনও প্রশাসক ওয়েব সার্ভারকে পুনর্নির্দেশের জন্য কনফিগার করতে পারে উদাহরণস্বরূপ সার্ভারে বা অন্য কোনও সমর্থনমূলক কাজের পুনরুদ্ধার করার সময়। আপনি যদি ডিএনএস থাকা URL- এর মাধ্যমে সার্ভারকে জিজ্ঞাসা করেন তবে প্রশাসক অন্য সার্ভারে আইপি ম্যাপিং পরিবর্তন করতে পারেন। তিনি ডিএনএস পুনরায় কনফিগারেশনের মতোই HTTP পুনর্নির্দেশ করতে পারেন। সমস্যা কি?
ওলেগ

আমার সমস্যাটি হ'ল পুনঃনির্দেশ জেনেরিক ত্রুটির পৃষ্ঠায়। আমি জানি সার্ভারটি আলাদাভাবে সেট আপ করা উচিত, তবে আপাতত আমার এই পরিস্থিতি যেমন রয়েছে তেমন সমাধানের প্রয়োজন হবে।
জার্জেন

23

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

আপনি যদি আগ্রহী হন তবে সেই কাস্টম শিরোনামটির জন্য আমাকে দেখতে হবে jQuery কোড:

/* redirects main window when AJAX request indicates that the session has expired on the backend. */
function checkSession(event, xhr, ajaxOptions)
{
    if (xhr.readyState == 4)
    {
        if(xhr.getResponseHeader("Login-Screen") != null && xhr.getResponseHeader("Login-Screen").length)
        {
            window.location.href='sessionExpired.html'; //whatever
        }
    }
}

$(document).ajaxComplete(checkSession)

1
ধন্যবাদ, আমি অনুমান করি যে আমাকে প্রতিক্রিয়াটি বিশ্লেষণ করে একই ধরণের পদ্ধতির জন্য সমাধান করতে হবে।
জর্জেন

11

আপনার কলটি পুনঃনির্দেশিত হয়েছে কিনা তা যাচাই করার জন্য আমি একটি বৈশিষ্ট্য পেয়েছি। এটি xhr.state (): যদি এটি "প্রত্যাখ্যান" হয় তবে একটি পুনর্নির্দেশ ঘটে।

সাফল্য কলব্যাক সহ উদাহরণ:

request.success(function(data, textStatus, xhr)
{
    if(xhr.state() == "resolved")
    {
        //no redirection
    }
    if(xhr.state() == "rejected")
    {
        //redirection
    }
});

ত্রুটি কলব্যাক সহ উদাহরণ:

request.error(function(xhr, textStatus)
{
    if (xhr.state() == "rejected")
    {
        //redirection
        location.href = "loginpage";
    } else
    {
        //some other error happened
        alert("error");
    }
});

1
আপনার উত্তরের টিপটি সত্যই জিনিসগুলিকে কাজ করতে সহায়তা করেছে। অন্যদের সহায়তা করতে পারে এমন নোটগুলির জন্য, আমাদের ওয়েবস্পিয়ার পোর্টালটির সুরক্ষা সাইটমাইন্ডারের সাথে একীকরণ করেছে। আমাদের একটি পোর্টলেট রয়েছে যা অ্যাজাক্সকে একটি সংস্থান ইউআরএল কল করতে হবে এবং এটি শেষ হয়ে গেলে এটি স্বচ্ছ পুনর্নির্দেশগুলি ঘটতে পারে তবে লগইন পৃষ্ঠায় কীভাবে পুনর্নির্দেশ করা যায় সে সম্পর্কে আমরা কোথাও হ্যান্ডেল পাচ্ছি না। JqXHR.state () "প্রত্যাখ্যান" হওয়ার বিষয়টি নিশ্চিতভাবে সহায়তা করেছে। আবার অনেক ধন্যবাদ।
উরেশ কুরুহুরী

দুর্দান্ত সন্ধান, তবে "প্রত্যাখ্যানিত" রাষ্ট্রের পক্ষে যেমন মিথ্যা ইতিবাচকতা থাকতে পারে তখনও কোনও প্রতিশ্রুতি প্রত্যাখ্যান করা হয় এবং কেবল পুনর্নির্দেশের দিকে নয়। jQuery ব্যাখ্যা করেছে যখন "প্রত্যাখ্যানিত" রাষ্ট্রটি api.jquery.com/deferred.state
নিতিন

1

আমি পূর্ববর্তী কোডারদের প্রতিক্রিয়া জানার মতো অন্তর্দৃষ্টিপূর্ণ জ্ঞানকে সম্ভবত যুক্ত করতে পারি না, তবে আমি একটি নির্দিষ্ট কেস যুক্ত করব যা অন্যরা জানতে আগ্রহী হতে পারে।

আমি শেয়ারপয়েন্টের প্রসঙ্গে এই 302 নীরব পুনঃনির্দেশটি পেরিয়ে এসেছি। আমার কাছে কিছু সাধারণ জাভাস্ক্রিপ্ট ক্লায়েন্ট কোড রয়েছে যা একটি শেয়ারপয়েন্ট উপ-সাইটকে পিং করে এবং যদি এটি একটি 200 এইচটিটিপি প্রতিক্রিয়া পায় তবে এটি সেই সাইটটিতে স্থানান্তরিত হয় viawindow.location । যদি এটি অন্য কিছু গ্রহণ করে তবে এটি ব্যবহারকারীকে বিজ্ঞপ্তি দেয় যে সাইটটি বিদ্যমান নেই।

তবে, সাইটটি বিদ্যমান রয়েছে তবে ব্যবহারকারীর অনুমতি নেই, সেই ক্ষেত্রে শেয়ারপয়েন্টটি নিঃশব্দে একটি অ্যাক্সেসডিনয়েড.এএসপিএক্স পৃষ্ঠাতে পুনর্নির্দেশ করে। শেয়ারপয়েন্ট ইতিমধ্যে সার্ভার / ফার্ম স্তরে HTTP 401 প্রমাণীকরণের হ্যান্ডশেক করেছে - ব্যবহারকারীর শেয়ারপয়েন্টে অ্যাক্সেস রয়েছে। তবে সাব-সাইটে অ্যাক্সেসটি পরিচালনা করা হয়েছে আমি মনে করি কোনও ধরণের ডাটাবেস পতাকা ব্যবহার করে। নীরব পুনর্নির্দেশটি আমার "অন্য" ধারাটিকে বাইপাস করে, তাই আমি নিজের ত্রুটিটি ছুঁড়ে ফেলতে পারি না। আমার ক্ষেত্রে এটি কোনও শো-স্টপার নয় - এটি ধারাবাহিকভাবে অনুমানযোগ্য আচরণ। তবে এটি কিছুটা অবাক হয়েছিল, এবং আমি এই প্রক্রিয়াতে এইচটিটিপি অনুরোধ সম্পর্কে কিছু শিখেছি!


1

আমি একই জিনিসটিতে আগ্রহী ছিলাম এবং তাকমানের দ্বারা বর্ণিতstate() পদ্ধতিটি খুঁজে পেলাম না এবং এবং নিজের জন্য কিছুটা খনন করলাম। লোকেরা জবাবের সন্ধানে এখানে সরে আসার জন্য, আমার অনুসন্ধানগুলি এখানে:

একাধিকবার বলা হয়েছে, আপনি পুনর্নির্দেশগুলি প্রতিরোধ করতে পারবেন না, তবে আপনি সেগুলি সনাক্ত করতে পারেন। মতে MDN আপনি ব্যবহার করতে পারেন responseURLএর XMLHttpRequestObjectসব পুনঃনির্দেশ পর, যা চূড়ান্ত URL প্রতিক্রিয়া থেকে এসেছিলেন উপস্থিত থাকবে। কেবলমাত্র সতর্কতাই হ'ল এটি ইন্টারনেট এক্সপ্লোরার দ্বারা সমর্থিত নয় (এজ এটি রয়েছে)। যেহেতু xhr/ jquery jqXHRএর success/ doneফাংশনে উত্তীর্ণ হ'ল প্রকৃতির একটি এক্সটেনশন XMLHttpRequest, এটি সেখানেও পাওয়া উচিত।


0

আমি মনে করি আপনি একটি 200 প্রতিক্রিয়া পেয়েছেন কারণ দ্বিতীয়বার কোনও পুনর্নির্দেশ নেই, কারণ 404 পৃষ্ঠাটির মেয়াদ শেষ হয় না, এটি ক্যাশে সংরক্ষণ করা হয়েছে। এর অর্থ দ্বিতীয়বার ব্রাউজারটি আপনাকে ক্যাশে পৃষ্ঠা দেয়। এজ্যাক্স জ্যাকোরিতে একটি সম্পত্তি "ক্যাশে" রয়েছে। http://api.jquery.com/jQuery.ajax/

আপনার এটি "মিথ্যা" লিখতে হবে


0

এক্সএমএলএইচটিপিআরকোয়েস্টগুলিতে নিম্নলিখিত অবস্থানে পুনর্নির্দেশ অক্ষম করা সম্ভব না হলেও , আনতে () ব্যবহার করার সময় এটি ঘটে :

fetch('url', {redirect: manual});

পুনঃনির্দেশকৃত URL কী ছিল তা আপনাকে জানাবে না। আপনি আচরণটি অক্ষম করতে পারেন, তবে "পুনর্নির্দেশ: ম্যানুয়াল" ব্যবহারকারীর পুনর্নির্দেশ হ্যান্ডেলটিকে নিজের নামকরণ করতে না দেওয়ার উদ্দেশ্যে নয়।
lcjury

-2

এটি আপনার ক্ষেত্রে প্রযোজ্য কিনা তা আমি নিশ্চিত নই, তবে আপনি এজেএক্স ফাংশনে নির্দিষ্ট স্থিতি কোডগুলিতে প্রতিক্রিয়া জানাতে কোড লিখতে পারেন -

$.ajax({
    url: '/admin/secret/data',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    statusCode: {
        200: function (data) {
            alert('302: Occurred');
            // Bind the JSON data to the UI
        },
        401: function (data) {
            alert('401: Occurred');
            // Handle the 401 error here.
        }
    }
});

9
আমি মনে করি না এটি প্রযোজ্য কারণ ওপি বলেছে যে পটভূমিতে ঘটে যাওয়া পুনঃনির্দেশের কারণে তিনি সর্বদা একটি 200 স্ট্যাটাস কোড পান ..
হ্যাঁ ব্যারি

-4

এজ্যাক্স রিকোয়েস্টের ক্ষেত্রে অনুরোধ শিরোনামগুলিতে আপনার নিম্নলিখিতগুলি থাকবে

X-Requested-With    XMLHttpRequest

সার্ভারের এই মানদণ্ডের দ্বারা আপনি অনুরোধগুলি ফিল্টার করতে পারেন।


তিনি অনুরোধটি নয় (যার উপর তার ইতিমধ্যে নিয়ন্ত্রণ রয়েছে) প্রতিক্রিয়া যাচাই করতে চেয়েছিলেন
হ্যা ব্যারি

হয়তো জিএফক্স পরামর্শ দিয়েছিল যে অজ্যাক্স অনুরোধের জন্য 3xx ফিরে আসা অর্থহীন, আপনি এই জাতীয় অনুরোধটি ফিল্টার করতে পারেন এবং উদাহরণস্বরূপ 403 ফেরত দিতে পারেন। যখন আপনার কোনও ওয়েবসাইট রয়েছে যা এমন পৃষ্ঠাগুলি পরিবেশন করে যা ফর্মগুলির প্রমাণীকরণের প্রয়োজন হয় এবং সেই পৃষ্ঠাগুলি এজাক্স কলগুলিও করে এবং আপনি অনুমোদনের যুক্তি এক জায়গায় রাখতে চান, তবে আমার কাছে এটি একটি বৈধ উত্তর।
maciejW
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.