কীভাবে jQuery Ajax কলের পরে পুনর্নির্দেশের অনুরোধটি পরিচালনা করবেন


1368

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

আমি কীভাবে jQuery 1.2.6 এর সাথে অ্যাজাক্স কল থেকে পুনর্নির্দেশের নির্দেশনা পরিচালনা করতে পারি?


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

1
সম্পর্কিত প্রশ্ন দেখুন: স্ট্যাকওভারফ্লো
নিউটেল

HttpContext.Response.AddHeaderঅজ্যাক্সেটআপ সাসেসে দ্য অ্যান্ড চেকটি যাবার উপায়
এলসিজে

4
কেন সার্ভার 401 ফিরিয়ে দিতে পারে না? সেক্ষেত্রে আপনার একটি বৈশ্বিক aj .জ্যাক্সসেটআপ থাকতে পারে এবং পৃষ্ঠাটি পুনর্নির্দেশের জন্য স্থিতি কোডটি ব্যবহার করতে পারেন।
বিশাল

1
এই লিঙ্কটি doanduyhai.wordpress.com/2012/04/21/… আমাকে সঠিক সমাধান দেয়
pappu_kutty

উত্তর:


697

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

আরও খনন করার পরে, আমি এই পদ্ধতির সঞ্চার করেছি এবং JSON ব্যবহার করেছি । এই ক্ষেত্রে, AJAX অনুরোধের সমস্ত প্রতিক্রিয়াগুলির স্থিতি কোড 200 রয়েছে এবং প্রতিক্রিয়াটির শরীরে একটি JSON অবজেক্ট রয়েছে যা সার্ভারে নির্মিত। ক্লায়েন্টের জাভাস্ক্রিপ্ট তারপরে কী করা দরকার তা সিদ্ধান্ত নিতে JSON অবজেক্টটি ব্যবহার করতে পারে।

আমার আপনার একই সমস্যা ছিল। আমি একটি এজ্যাক্স অনুরোধটি সম্পাদন করি যার 2 টি প্রতিক্রিয়া রয়েছে: একটি যা ব্রাউজারটিকে নতুন পৃষ্ঠায় পুনঃনির্দেশ করে এবং একটি যা বর্তমান পৃষ্ঠায় বিদ্যমান এইচটিএমএল ফর্মকে নতুন সাথে প্রতিস্থাপন করে। এটি করার জন্য jQuery কোডটি দেখতে এমন কিছু দেখাচ্ছে:

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        } else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});

JSON অবজেক্ট "ডেটা" সার্ভারে তৈরি করা হয়েছে যাতে 2 জন সদস্য থাকে: data.redirectএবং data.form। আমি এই পদ্ধতির অনেক ভাল হতে পারে।


58
হিসাবে সমাধান বিবৃত stackoverflow.com/questions/503093/... এটা ব্যবহার window.location.replace (data.redirect) এর উত্তম; window.location.href = data.redirect এর চেয়ে;
কার্লস ব্যারোবসের

8
ক্রিয়ায় এইচটিটিপি কোড ব্যবহার করা ভাল না কেন তার কোনও কারণ। উদাহরণস্বরূপ একটি 307 কোড যা HTTP অস্থায়ী পুনঃনির্দেশ?
সের্গেই গোলস

15
@ সের্গেই গলোস এর কারণ হ'ল আপনি যদি কোনও এইচটিটিপি পুনর্নির্দেশ করেন তবে পুনঃনির্দেশ আসলে কখনও অজাক্স সাফল্য কলব্যাকে আসে না। ব্রাউজারটি পুনঃনির্দেশের গন্তব্যের সামগ্রীর সাথে 200 কোড সরবরাহের পুনঃনির্দেশের প্রক্রিয়া করে।
মিগুয়েল সিলভা

2
সার্ভার কোড দেখতে কেমন হবে? ডেটা.ফর্ম এবং ডেটা.ডাইরেক্টের রিটার্ন মান থাকতে হবে। মূলত আমি কীভাবে এটি নির্ধারণ করব যে আমি এটিতে একটি পুনর্নির্দেশ রেখেছি?
Vnge

6
সার্ভারে এটি কীভাবে করা হয় তা যদি দেখানো হত তবে এই উত্তরটি আরও সহায়ক হবে।
পেড্রো হোহেল কারভালহো

243

আমি এই সমস্যাটি এর দ্বারা সমাধান করেছি:

  1. প্রতিক্রিয়াটিতে একটি কাস্টম শিরোনাম যুক্ত করা হচ্ছে:

    public ActionResult Index(){
        if (!HttpContext.User.Identity.IsAuthenticated)
        {
            HttpContext.Response.AddHeader("REQUIRES_AUTH","1");
        }
        return View();
    }
  2. ajaxSuccessইভেন্টটিতে একটি জাভাস্ক্রিপ্ট ফাংশন বাঁধাই এবং শিরোনামটি আছে কিনা তা পরীক্ষা করে দেখুন:

    $(document).ajaxSuccess(function(event, request, settings) {
        if (request.getResponseHeader('REQUIRES_AUTH') === '1') {
           window.location = '/';
        }
    });

6
কি দুর্দান্ত সমাধান। আমি একটি স্টপ সমাধানের ধারণা পছন্দ করি like আমার একটি 403 স্থিতি পরীক্ষা করা দরকার, তবে আমি এজন্য শরীরে এজাক্সুসেস বাইন্ড ব্যবহার করতে পারি (যা আমি সত্যই খুঁজছিলাম)) ধন্যবাদ।
ব্রেটিকাস

4
আমি সবেমাত্র এটি করেছি এবং দেখতে পেলাম যে যেখানে আমার get .get () ফাংশনটি ব্যবহার করা হয়েছিল সেখানে আমার অজ্যাক্স কমপ্লিট দরকার ছিল এবং 200 ব্যতীত অন্য কোনও স্থিতি গুলি চালাচ্ছে না। আসলে, আমি সম্ভবত এর পরিবর্তে কেবলমাত্র অজ্যাক্সরারের সাথে আবদ্ধ থাকতে পারি। আরও তথ্যের জন্য নীচে আমার উত্তর দেখুন।
ব্রেটিকাস

2
এটি বেশিরভাগ ক্ষেত্রে ঠিক আছে, তবে যদি আপনার কাঠামো অনুমোদন পরিচালনা করে তবে কী হবে?
jwaliszko

13
আমি শিরোনামের পদ্ধতিটি পছন্দ করি তবে এটিও মনে করি - @ মডস্ 79৯ - এর মতো - কোথায় পুনর্নির্দেশ করতে হবে তার জ্ঞানটি নকল করা উচিত নয়। আমি বুলিয়ানের পরিবর্তে শিরোনাম REDIRECT_LOCATION যোগ করে এটি সমাধান করেছি।
rintcius

3
পুনঃনির্দেশের পরে প্রতিক্রিয়াটির উপর শিরোনামটি সেট করতে যত্ন নিন। এই পৃষ্ঠায় অন্যান্য উত্তরে বর্ণিত হিসাবে, পুনর্নির্দেশটি এজ্যাক্সসেস হ্যান্ডলারের কাছে স্বচ্ছ হতে পারে। সুতরাং আমি লগইন পৃষ্ঠার জিইটি প্রতিক্রিয়াতে শিরোনামটি অন্তর্ভুক্ত করেছি (যা শেষ পর্যন্ত এবং কেবল আমার দৃশ্যে অজ্যাক্সস্যাক্সিকে ট্রিগার করে)।
সিপ্পল

118

কোনও ব্রাউজার 301 এবং 302 টি প্রতিক্রিয়া সঠিকভাবে পরিচালনা করে না। এবং প্রকৃতপক্ষে এমনকি মানটি এমনকি তাদের "স্বচ্ছভাবে" পরিচালনা করা উচিত যা আজাক্স লাইব্রেরি বিক্রেতাদের জন্য একটি প্রধান মাথাব্যথা। ইন রা-আয়াক্স আমরা স্বচ্ছভাবে পরিচালনা করতে সার্ভার থেকে পুননির্দেশনা HTTP প্রতিক্রিয়া স্থিতি কোড 278 (ঠিক কিছু "অব্যবহৃত" সফল কোড) ব্যবহার করতে বাধ্য হয়েছে ...

এটি সত্যই আমাকে বিরক্ত করে এবং যদি এখানে কারও কারও কাছে ডাব্লু 3 সি তে কিছু "টান" থাকে তবে আমি প্রশংসা করব যে আপনি ডাব্লু 3 কে জানাতে পারেন যে আমাদের সত্যই আমাদের 301 এবং 302 কোডগুলি হ্যান্ডেল করা দরকার ...! ;)


3
আমি একটি পদক্ষেপের জন্য যে 278 অফিসিয়াল এইচটিটিপি স্পেক থেকে পৃথক হওয়া উচিত।
ক্রিস মেরিসিক

2
এটি ইতিমধ্যে স্বচ্ছভাবে তাদের পরিচালনা করে না? যদি কোনও উত্স সরানো থাকে, এটিকে স্বচ্ছভাবে পরিচালনা করার অর্থ প্রদত্ত ইউআরএলটিতে অনুরোধটি পুনরাবৃত্তি করা। এটিই আমি এক্সএমএলএইচটিপিআরকেয়েস্ট এপিআই ব্যবহার করার প্রত্যাশা করব।
ফিলিপ র্যাথ

@ ফিলিপারথé সম্মত হন। স্বচ্ছভাবে পরিচালনা করা হ'ল আমি চাই। কেন জানি এটি খারাপ বিবেচনা করা হয় তা আমি জানি না।
স্মিভিকিপিডিয়া

@ এসএমউইকিপিডিয়া পৃষ্ঠাটি পুনর্নির্দেশ না করে মূল বিভাগে মার্কআপটিকে পুনর্নির্দেশের ব্যবস্থা করতে।
সেমিসি

যদি এখানে কারও ডাব্লু 3 সি তে কিছু "টান" থাকে তবে আমি প্রশংসা করব যে আপনি ডাব্লু 3 কে জানাতে পারেন যে আমাদের সত্যই আমাদের 301 এবং 302 কোডগুলি হ্যান্ডেল করা দরকার ...! ;)
টমি.ট্যাং

100

অবশেষে যে সমাধানটি কার্যকর করা হয়েছিল তা হ'ল অ্যাজাক্স কলের কলব্যাক ফাংশনের জন্য একটি মোড়ক ব্যবহার করা এবং প্রত্যাবর্তিত এইচটিএমএল অংশে একটি নির্দিষ্ট উপাদানটির অস্তিত্বের জন্য এই মোড়কের চেকটিতে। যদি উপাদানটি পাওয়া যায় তবে মোড়ক একটি পুনর্নির্দেশ কার্যকর করেছে। যদি তা না হয় তবে মোড়ক রিয়েল কলটি আসল কলব্যাক ফাংশনে পাঠিয়েছে।

উদাহরণস্বরূপ, আমাদের মোড়ক ফাংশনটি এমন ছিল:

function cbWrapper(data, funct){
    if($("#myForm", data).length > 0)
        top.location.href="login.htm";//redirection
    else
        funct(data);
}

তারপরে, আজাক্স কল করার সময় আমরা এরকম কিছু ব্যবহার করেছি:

$.post("myAjaxHandler", 
       {
        param1: foo,
        param2: bar
       },
       function(data){
           cbWrapper(data, myActualCB);
       }, 
       "html"
);

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


4
দ্রষ্টব্য যে এটি সিবিওয়্যার্পার (ফান্ট) {রিটার্ন ফাংশন (ডেটা) function যদি ("(" # মাইফর্ম ", ডেটা)) আকারে ছোট করা যেতে পারে তবে সাইজ ()> 0) top.location.href =" লগইন "; অন্য ফান্ট (ডেটা); }}। তারপরে .পস্টে কল করার সময় আপনার কেবলমাত্র সিবিওয়্যার্পার (myActualCB) প্রয়োজন। হ্যাঁ, মন্তব্যে কোডটি একটি
গণ্ডগোল

আকার হ্রাস করা হয়েছে যাতে আপনি আকারের স্থানে দৈর্ঘ্য এখানে ব্যবহার করতে পারেন
sunil

66

আমি লেবু এর একটি সামান্য বাঁক সঙ্গে টিমার্জ এর পদ্ধতি পছন্দ। আপনি কি কখনো ফিরে পেতে পারেন contentType এর পাঠ্য / HTML যখন আপনি আশা করছেন তাদেরকে JSON , আপনি সম্ভবত পুনঃনির্দেশিত করা হচ্ছে। আমার ক্ষেত্রে, আমি কেবল পৃষ্ঠাটি পুনরায় লোড করি এবং এটি লগইন পৃষ্ঠায় পুনঃনির্দেশিত হয়। ওহ, এবং দেখুন যে jqXHR স্ট্যাটাসটি 200, যা নির্বোধ বলে মনে হয়, কারণ আপনি ত্রুটি ফাংশনে রয়েছেন, তাই না? অন্যথায়, বৈধ ত্রুটির ঘটনাগুলি পুনরাবৃত্তি পুনরায় লোড করতে বাধ্য করবে (ওফস)

$.ajax(
   error:  function (jqXHR, timeout, message) {
    var contentType = jqXHR.getResponseHeader("Content-Type");
    if (jqXHR.status === 200 && contentType.toLowerCase().indexOf("text/html") >= 0) {
        // assume that our login has expired - reload our current page
        window.location.reload();
    }

});

1
ব্রায়ানকে অনেক ধন্যবাদ, আপনার উত্তরটি আমার দৃশ্যের জন্য সেরা ছিল, যদিও আমি চাই যে কোনও "নিরাপদ বিষয়বস্তু" পরীক্ষার পরিবর্তে কোন ইউআরএল / পৃষ্ঠাটি পুনঃনির্দেশ করছে সেই তুলনা করার মতো নিরাপদ চেক থাকলে। JqXHR অবজেক্ট থেকে কোন পৃষ্ঠাটি পুনর্নির্দেশ করছে তা সন্ধান করতে আমি অক্ষম ছিলাম।
জনি

আমি 401 স্থিতির জন্য পরীক্ষা করেছিলাম এবং তারপরে পুনঃনির্দেশ করি। চ্যাম্পের মতো কাজ করে।
এরিক

55

নিম্ন-স্তরের $.ajax()কলটি ব্যবহার করুন :

$.ajax({
  url: "/yourservlet",
  data: { },
  complete: function(xmlHttp) {
    // xmlHttp is a XMLHttpRquest object
    alert(xmlHttp.status);
  }
});

পুনঃনির্দেশের জন্য এটি ব্যবহার করে দেখুন:

if (xmlHttp.code != 200) {
  top.location.href = '/some/other/page';
}

আমি নিম্ন স্তরের জিনিস এড়াতে চেষ্টা করছিলাম। যাইহোক, ধরুন আমি আপনার বর্ণনার মতো কিছু ব্যবহার করেছি, এইচটিটিপি কোড 3xx এটি সনাক্ত করার পরে আমি কীভাবে কোনও ব্রাউজার পুনর্নির্দেশকে বাধ্য করব? আমার লক্ষ্য ব্যবহারকারীকে পুনর্নির্দেশ করা, কেবল তার অধিবেশনটির সময়সীমা শেষ হয়ে গেছে তা ঘোষণা করা নয়।
এলিয়ট ভার্গাস

4
বিটিডব্লিউ, $ .জ্যাক্স () খুব খুব কম স্তরের নয়। এটি jQuery এর নিরিখে কেবল নিম্ন-স্তরের কারণ এখানে get .get, $। পোষ্ট ইত্যাদি রয়েছে যা $ .জ্যাক্স এবং এর সমস্ত বিকল্পের চেয়ে অনেক বেশি সহজ।
পর্যন্ত

16
ওহ ছেলে! দুঃখিত, আপনার উত্তরটি আমাকে "অ-স্বীকার" করতে হয়েছিল, এটি এখনও খুব সহায়ক। কথাটি হ'ল, পুনঃনির্দেশগুলি এক্সএমএলএইচটিপিআরকুয়েস্টটি স্বয়ংক্রিয়ভাবে পরিচালিত হয়, তাই আমি পুনঃনির্দেশের পরে দীর্ঘশ্বাস (দীর্ঘশ্বাস!) পাওয়ার পরে একটি 200 স্ট্যাটাস কোডটি সবসময় পাই। আমার মনে হয় এইচটিএমএল পার্স করা এবং মার্কার সন্ধানের মতো আমাকে বাজে কিছু করতে হবে।
এলিয়ট ভার্গাস

1
শুধু কৌতূহলী, যদি সেশনটি সার্ভারে শেষ হয়, তার মানে এই নয় যে সার্ভারটি একটি ভিন্ন SESSIONID প্রেরণ করে? আমরা কি কেবল এটি সনাক্ত করতে পারি না?
সালামান্ডের

10
দ্রষ্টব্য: এটি পুনঃনির্দেশগুলির জন্য কাজ করে না। আজাক্স নতুন পৃষ্ঠায় যাবে এবং তার স্থিতি কোডটি ফিরিয়ে দেবে।

33

আমি কেবল আমার দৃষ্টিভঙ্গিটি ভাগ করে নিতে চাইছিলাম কারণ এটি কারওর পক্ষে সহায়তা করতে পারে:

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

আমার পরিস্থিতি: আমাদের মধ্যে মূলত একটি আইএসএ সার্ভার রয়েছে যা সমস্ত অনুরোধ শুনবে এবং আমাদের লগইন পৃষ্ঠায় 302 এবং একটি অবস্থান শিরোনাম দিয়ে সাড়া দেয়

আমার জাভাস্ক্রিপ্ট মডিউলে আমার প্রাথমিক পদ্ধতির মতো কিছু ছিল

$(document).ajaxComplete(function(e, xhr, settings){
    if(xhr.status === 302){
        //check for location header and redirect...
    }
});

সমস্যা (এখানে ইতিমধ্যে উল্লিখিত অনেকগুলি) হ'ল ব্রাউজারটি নিজেই পুনঃনির্দেশ পরিচালনা করে যার ফলে আমার ajaxCompleteকলব্যাক কখনও কল হয় নি, তবে এর পরিবর্তে আমি ইতিমধ্যে পুনঃনির্দেশিত লগইন পৃষ্ঠার প্রতিক্রিয়া পেয়েছি যা সম্ভবত একটি ছিলstatus 200 । সমস্যা: সফল 200 প্রতিক্রিয়া আপনার আসল লগইন পৃষ্ঠা বা অন্য কোনও স্বেচ্ছাসেবক পৃষ্ঠা কিনা তা আপনি কীভাবে আবিষ্কার করবেন ??

সমাধান

যেহেতু আমি 302 টি পুনর্নির্দেশ প্রতিক্রিয়াগুলি ক্যাপচার করতে সক্ষম হইনি, তাই আমি LoginPageআমার লগইন পৃষ্ঠায় একটি শিরোনাম যুক্ত করেছি যাতে লগইন পৃষ্ঠার ইউআরএল রয়েছে contained মডিউলে আমি এখন শিরোনাম শুনেছি এবং একটি পুনর্নির্দেশ করব:

if(xhr.status === 200){
    var loginPageRedirectHeader = xhr.getResponseHeader("LoginPage");
    if(loginPageRedirectHeader && loginPageRedirectHeader !== ""){
        window.location.replace(loginPageRedirectHeader);
    }
}

... এবং এটি কমন :) এর মতো কাজ করে। আপনি হয়ত ভাবতে পারেন কেন আমি ইউআরএলটিকে LoginPageশিরোলেখের সাথে অন্তর্ভুক্ত করেছি ... কারণ মূলত কারণ আমি ইউআরএলটি নির্ধারণের কোনও উপায় খুঁজে পাই নি GETযা স্বয়ংক্রিয় অবস্থানের ফলে xhrঅবজেক্ট থেকে পুনঃনির্দেশিত হয় ...


+1 - তবে কাস্টম শিরোনামগুলি দিয়ে শুরু হওয়ার কথা X-, সুতরাং ব্যবহারের জন্য আরও ভাল শিরোনাম হবে X-LoginPage: http://example.com/login
unnbɐɥs

6
পুনঃটুইট আমি এক্স উপসর্গটি ব্যবহার করিনি কারণ জুন ২০১১ সালে একটি আইটিইএফ ডকুমেন্ট তাদের অবমূল্যায়নের প্রস্তাব করেছিল এবং সত্যই, জুন ২০১২ এর সাথে এটি কোনও অফিসিয়াল নয় যে কাস্টম শিরোনামগুলির আর কোনও উপসর্গ করা উচিত নয় X-
জুড়ি

আমাদের একটি আইএসএ সার্ভারও আছে এবং আমি ঠিক একই সমস্যাটিতে চলে এসেছি। কোডটিতে এটিকে ঘিরে কাজ করার পরিবর্তে, আমরা রিডাইরেক্টিং বন্ধ করতে আইএসএ কনফিগার করতে kb2596444- এ নির্দেশাবলী ব্যবহার করেছি ।
স্কট পাথর

29

আমি জানি যে এই বিষয়টি পুরানো, তবে আমি এখানে খুঁজে পেয়েছি এবং পূর্বে বর্ণিত হয়েছে এমন আরও একটি উপায় দেব । মূলত আমি ডাব্লুআইএফ এর সাথে এএসপি.এমভিসি ব্যবহার করছি (তবে এই বিষয়টির প্রেক্ষাপটের জন্য এটি সত্যই গুরুত্বপূর্ণ নয় - কোন ফ্রেমওয়ার্ক ব্যবহার করা হয় তা উত্তরই যথেষ্ট adequate )

নীচে দেখানো পদ্ধতির বাক্সের বাইরে সমস্ত অজ্যাক্স অনুরোধগুলিতে প্রয়োগ করা যেতে পারে (যদি তারা অবশ্যই ইভেন্টটি পাঠানোর আগে পুনরায় সংজ্ঞায়িত না করে)।

$.ajaxSetup({
    beforeSend: checkPulse,
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        document.open();
        document.write(XMLHttpRequest.responseText);
        document.close();
    }
});

কোনও এজাক্স অনুরোধ সম্পাদনের আগে CheckPulseপদ্ধতিটি চালিত হওয়ার আগে (নিয়ন্ত্রণকারী পদ্ধতি যা সহজ কিছু হতে পারে):

[Authorize]
public virtual void CheckPulse() {}

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

protected void Application_EndRequest()
{
    if (Context.Response.StatusCode == 302
        && (new HttpContextWrapper(Context)).Request.IsAjaxRequest())
    {                
        Context.Response.StatusCode = 200;
        Context.Response.AddHeader("REQUIRES_AUTH", "1");
    }
}

অবশেষে ক্লায়েন্ট সাইড এ যেমন কাস্টম শিরোনাম পরীক্ষা করুন। যদি উপস্থিত থাকে - লগন পৃষ্ঠায় সম্পূর্ণ পুনঃনির্দেশ করা উচিত (আমার ক্ষেত্রে window.locationঅনুরোধ থেকে url দ্বারা প্রতিস্থাপন করা হবে যা আমার কাঠামোর দ্বারা স্বয়ংক্রিয়ভাবে পরিচালিত হবে)।

function checkPulse(XMLHttpRequest) {
    var location = window.location.href;
    $.ajax({
        url: "/Controller/CheckPulse",
        type: 'GET',
        async: false,
        beforeSend: null,
        success:
            function (result, textStatus, xhr) {
                if (xhr.getResponseHeader('REQUIRES_AUTH') === '1') {
                    XMLHttpRequest.abort(); // terminate further ajax execution
                    window.location = location;
                }
            }
    });
}

আমি EndRequest ইভেন্টের পরিবর্তে PostAuthenticateRequest ইভেন্ট ব্যবহার করে সমস্যার সমাধান করেছি।
ফ্রিনাভালে

@ জারোসলাওয়ালিসস্কো আমি আমার শেষ জবাবটিতে ভুল ঘটনাটি আটকালাম! আমি PreSendRequestHeilers ইভেন্ট ..... পোস্টআউটিক্যান্সেটের অনুসন্ধান নয়! >> ব্লাশ << আমার ভুল উল্লেখ করার জন্য আপনাকে ধন্যবাদ।
ফ্রিনাভালে

@ জারোসলাওয়ালিসস্কো ডাব্লুআইএফ ব্যবহার করার সময় আপনি এজেএক্স অনুরোধগুলির জন্য 401 টি প্রতিক্রিয়াও ফিরিয়ে দিতে পারেন এবং আপনার জাভাস্ক্রিপ্টটিকে এগুলি পরিচালনা করতে দিন। এছাড়াও আপনি ধরে নিচ্ছেন যে সমস্ত 302 টির জন্য প্রমাণীকরণের প্রয়োজন যা সমস্ত ক্ষেত্রে সত্য নাও হতে পারে। কেউ আগ্রহী হলে আমি একটি উত্তর যুক্ত করেছি।
রব

26

আমি মনে করি এটি হ্যান্ডেল করার একটি ভাল উপায় হ'ল বিশেষতভাবে বিদ্যমান এইচটিটিপি প্রোটোকল প্রতিক্রিয়া কোডগুলি উপার্জন করা 401 Unauthorized

আমি কীভাবে এটি সমাধান করেছি তা এখানে:

  1. সার্ভারের দিক: যদি সেশনটির মেয়াদ শেষ হয় এবং অনুরোধটি আজাক্স হয়। একটি 401 প্রতিক্রিয়া কোড শিরোনাম প্রেরণ করুন
  2. ক্লায়েন্টের দিক: এজাক্স ইভেন্টগুলিতে আবদ্ধ

    $('body').bind('ajaxSuccess',function(event,request,settings){
    if (401 == request.status){
        window.location = '/users/login';
    }
    }).bind('ajaxError',function(event,request,settings){
    if (401 == request.status){
        window.location = '/users/login';
    }
    });

আইএমও এটি আরও জেনেরিক এবং আপনি কিছু নতুন কাস্টম স্পেস / শিরোনাম লিখছেন না। আপনার বিদ্যমান অজ্যাক্স কলগুলির কোনও সংশোধন করার দরকার নেই।

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


আমি একই পদ্ধতির ব্যবহার। JQuery 403 ত্রুটি কোডে সত্যই অজেক্সস্যাক্সেস কল করে? আমার মনে হয় কেবলমাত্র অজ্যাক্সেরর অংশটি আসলেই প্রয়োজন
মারিয়াস বালিয়েটিস

24

আমি এই সমস্যাটি এর মতো সমাধান করেছি:

প্রতিক্রিয়া প্রক্রিয়াকরণের জন্য মিডলওয়্যার যুক্ত করুন, যদি এটি অ্যাজাক্স অনুরোধের জন্য পুনর্নির্দেশ হয়, তবে পুনঃনির্দেশ url দিয়ে একটি স্বাভাবিক প্রতিক্রিয়াতে প্রতিক্রিয়া পরিবর্তন করুন।

class AjaxRedirect(object):
  def process_response(self, request, response):
    if request.is_ajax():
      if type(response) == HttpResponseRedirect:
        r = HttpResponse(json.dumps({'redirect': response['Location']}))
        return r
    return response

তারপরে অজ্যাক্স কমপ্লিতে, প্রতিক্রিয়ায় যদি পুনর্নির্দেশ থাকে তবে তা অবশ্যই পুনর্নির্দেশ করা উচিত, তাই ব্রাউজারের অবস্থান পরিবর্তন করুন।

$('body').ajaxComplete(function (e, xhr, settings) {
   if (xhr.status == 200) {
       var redirect = null;
       try {
           redirect = $.parseJSON(xhr.responseText).redirect;
           if (redirect) {
               window.location.href = redirect.replace(/\?.*$/, "?next=" + window.location.pathname);
           }
       } catch (e) {
           return;
       }
   }
}

20

আমার কাছে একটি সহজ সমাধান রয়েছে যা আমার পক্ষে কাজ করে, কোনও সার্ভার কোড পরিবর্তনের দরকার নেই ... কেবল এক চামচ জায়ফল যোগ করুন ...

$(document).ready(function ()
{
    $(document).ajaxSend(
    function(event,request,settings)
    {
        var intercepted_success = settings.success;
        settings.success = function( a, b, c ) 
        {  
            if( request.responseText.indexOf( "<html>" ) > -1 )
                window.location = window.location;
            else
                intercepted_success( a, b, c );
        };
    });
});

আমি এইচটিএমএল ট্যাগের উপস্থিতি যাচাই করেছি, তবে আপনার লগইন পৃষ্ঠায় যা অনন্য স্ট্রিং রয়েছে তা সন্ধান করতে আপনি সূচিপত্র পরিবর্তন করতে পারেন ...


এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে না, এটি অজ্যাক্স কল দিয়ে সংজ্ঞায়িত ফাংশনটি কল করতে থাকে, এটি সাফল্যের পদ্ধতিটিকে ওভাররাইড করে না বলে মনে হয়।
adriaanp

মনে হয় না আমার পক্ষে কাজ করে, কমপক্ষে আর। এখানে সম্ভাব্য ব্যাখ্যা: stackoverflow.com/a/12010724/260665
রাজ পবন Gumdal

20

আমি আরও একটি সমাধান পেয়েছি (বিশেষত কার্যকর যদি আপনি বিশ্বব্যাপী আচরণ নির্ধারণ করতে চান) হ'ল সম্পত্তিটির সাথে একত্রে $.ajaxsetup()পদ্ধতিটি ব্যবহার করা । অন্যদের মতো চিহ্নিত করা, একটি পুনর্নির্দেশ স্ট্যাটাসকোড ( ) ব্যবহার করবেন না , পরিবর্তে একটি স্ট্যাটাসকোড ব্যবহার করুন এবং পুনর্নির্দেশ ক্লায়েন্ট-সাইডটি পরিচালনা করুন।statusCode3xx4xx

$.ajaxSetup({ 
  statusCode : {
    400 : function () {
      window.location = "/";
    }
  }
});

400আপনি যে স্ট্যাটাসকোড পরিচালনা করতে চান তা দিয়ে প্রতিস্থাপন করুন । ইতিমধ্যে উল্লিখিত মত 401 Unauthorizedএকটি ভাল ধারণা হতে পারে। এটি 400যেহেতু এটি অত্যন্ত অপ্রয়োজনীয় এবং আমি 401সুনির্দিষ্ট ক্ষেত্রে (ভুল লগইন শংসাপত্রগুলির মতো) ব্যবহার করতে পারি । সুতরাং 4xxঅধিবেশনটি পুনর্নির্দেশের পরিবর্তে আপনার ব্যাকএন্ডে একটি ত্রুটি-কোড ফিরে আসা উচিত যখন সেশনটির সময় শেষ হয়ে যায় এবং আপনি পুনর্নির্দেশ ক্লায়েন্ট-সাইডটি পরিচালনা করেন। এমনকি ব্যাকবোন.জেএস এর মতো ফ্রেমওয়ার্ক সহ আমার জন্য নিখুঁত কাজ করে


পৃষ্ঠায় ফাংশন উল্লেখ করার জন্য কোথায়?
বিক্রান্ত

@ ভিক্র্যান্ট যদি আমি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে jQuery লোড হওয়ার পরে এবং আপনি আসল অনুরোধগুলি করার আগে আপনি ফাংশনটি কল করতে পারেন।
morten.c

19

প্রদত্ত সমাধানগুলির বেশিরভাগই একটি অতিরিক্ত শিরোনাম বা একটি অকার্যকর এইচটিটিপি কোড ব্যবহার করে কার্যতালিকা ব্যবহার করে। এই সমাধানগুলি সম্ভবত কার্যকর হবে তবে কিছুটা 'হ্যাকি' বোধ করবে। আমি আরও একটি সমাধান নিয়ে এসেছি।

আমরা ডাব্লুএইচআইএফ ব্যবহার করছি যা 401 প্রতিক্রিয়াতে পুনর্নির্দেশের জন্য (প্যাসিভরেডইভারএনেবলড = "সত্য") কনফিগার করা আছে। সাধারণ অনুরোধগুলি পরিচালনা করার সময় পুনর্নির্দেশটি দরকারী but তবে এজেএক্স অনুরোধগুলির জন্য কাজ করবে না (যেহেতু ব্রাউজারগুলি 302 / পুনর্নির্দেশ কার্যকর করবে না)।

আপনার গ্লোবাল.এক্স্যাক্সে নিম্নলিখিত কোডটি ব্যবহার করে আপনি এজেএক্স অনুরোধগুলির জন্য পুনর্নির্দেশটি অক্ষম করতে পারবেন:

    void WSFederationAuthenticationModule_AuthorizationFailed(object sender, AuthorizationFailedEventArgs e)
    {
        string requestedWithHeader = HttpContext.Current.Request.Headers["X-Requested-With"];

        if (!string.IsNullOrEmpty(requestedWithHeader) && requestedWithHeader.Equals("XMLHttpRequest", StringComparison.OrdinalIgnoreCase))
        {
            e.RedirectToIdentityProvider = false;
        }
    }

এটি আপনাকে AJAX অনুরোধগুলির জন্য 401 প্রতিক্রিয়া ফিরিয়ে আনতে অনুমতি দেয়, যা আপনার জাভাস্ক্রিপ্টটি পৃষ্ঠাটি পুনরায় লোড করে হ্যান্ডেল করতে পারে। পৃষ্ঠাটি পুনরায় লোড করা একটি 401 নিক্ষেপ করবে যা ডাব্লুআইএফ দ্বারা পরিচালিত হবে (এবং ডাব্লুআইএইফ ব্যবহারকারীকে লগইন পৃষ্ঠায় পুনর্নির্দেশ করবে)।

401 ত্রুটিগুলি পরিচালনা করার জন্য জাভাস্ক্রিপ্টের একটি উদাহরণ:

$(document).ajaxError(function (event, jqxhr, settings, exception) {

    if (jqxhr.status == 401) { //Forbidden, go to login
        //Use a reload, WIF will redirect to Login
        location.reload(true);
    }
});

ভাল সমাধান। ধন্যবাদ।
ড্যানম্যান

19

এএসপি.নেট এমভিসি রেডিরেক্টটওএকশন পদ্ধতিটি ব্যবহার করে এই সমস্যাটি উপস্থিত হতে পারে। ডিভিতে প্রতিক্রিয়া প্রদর্শনের ফর্মটি প্রতিরোধ করতে আপনি $ .ajaxSetup এর সাথে অযোগ্য প্রতিক্রিয়াগুলির জন্য কেবল এক ধরণের এজ্যাক্স প্রতিক্রিয়া ফিল্টার করতে পারেন । যদি প্রতিক্রিয়াতে এমভিসি পুনঃনির্দেশ থাকে আপনি জেএস পক্ষে এই অভিব্যক্তিটি মূল্যায়ন করতে পারেন। নীচে জেএসের জন্য উদাহরণ কোড:

$.ajaxSetup({
    dataFilter: function (data, type) {
        if (data && typeof data == "string") {
            if (data.indexOf('window.location') > -1) {
                eval(data);
            }
        }
        return data;
    }
});

যদি ডেটা হয়: উপরের ফিল্টারটি "উইন্ডো.লোকেশন = '/ একাউন্ট / লগইন'" ফিল্টারটি ধরে ফেলবে এবং ডেটা প্রদর্শিত হওয়ার পরিবর্তে পুনর্নির্দেশটি তৈরি করার জন্য মূল্যায়ন করবে।


dataপ্রতিক্রিয়া শরীর বা শিরোলেখ হয়?
GMsoF 12'17

16

ভ্লাদিমির প্রুজনিকভ এবং টমাস হ্যানসেন যা বলেছিলেন তা এক সাথে রাখছেন:

  • এটি কোনও এক্সএইচআর কিনা তা সনাক্ত করতে আপনার সার্ভার-সাইড কোডটি পরিবর্তন করুন। যদি তা হয় তবে 278 এ পুনঃনির্দেশের প্রতিক্রিয়া কোডটি সেট করুন d জাঙ্গোতে:
   if request.is_ajax():
      response.status_code = 278

এটি ব্রাউজার প্রতিক্রিয়াটিকে সাফল্য হিসাবে বিবেচনা করে এবং এটি আপনার জাভাস্ক্রিপ্টে দেয়।

  • আপনার জেএসে, ফর্ম জমাটি অ্যাজাক্সের মাধ্যমে রয়েছে তা নিশ্চিত করুন, প্রতিক্রিয়া কোডটি পরীক্ষা করুন এবং প্রয়োজনে পুনর্নির্দেশ করুন:
$('#my-form').submit(function(event){ 

  event.preventDefault();   
  var options = {
    url: $(this).attr('action'),
    type: 'POST',
    complete: function(response, textStatus) {    
      if (response.status == 278) { 
        window.location = response.getResponseHeader('Location')
      }
      else { ... your code here ... } 
    },
    data: $(this).serialize(),   
  };   
  $.ajax(options); 
});

13
    <script>
    function showValues() {
        var str = $("form").serialize();
        $.post('loginUser.html', 
        str,
        function(responseText, responseStatus, responseXML){
            if(responseStatus=="success"){
                window.location= "adminIndex.html";
            }
        });     
    }
</script>

12

চেষ্টা

    $(document).ready(function () {
        if ($("#site").length > 0) {
            window.location = "<%= Url.Content("~") %>" + "Login/LogOn";
        }
    });

এটি লগইন পৃষ্ঠায় রাখুন। যদি এটি মূল পৃষ্ঠায় কোনও ডিভিতে লোড করা হয় তবে এটি লগইন পৃষ্ঠাটি পুনর্নির্দেশ করবে। "# সাইট" একটি ডিভির একটি আইডি যা লগইন পৃষ্ঠা ব্যতীত সমস্ত পৃষ্ঠায় অবস্থিত।


12

উত্তরগুলি লোকজনের জন্য কাজ করে বলে মনে হচ্ছে আপনি যদি স্প্রিং সিকিউরিটি ব্যবহার করেন তবে আমি লগইন ইউরাল অ্যাটেন্টিফিকেশন এন্ট্রিপয়েন্টটি প্রসারিত করেছি এবং এজেএক্সকে আরও শক্তিশালীভাবে পরিচালনা করতে নির্দিষ্ট কোড যুক্ত করতে পেয়েছি। বেশিরভাগ উদাহরণগুলি কেবল প্রমাণীকরণ ব্যর্থতা নয়, সমস্ত পুনর্নির্দেশকে বাধা দেয় । আমি যে প্রকল্পে কাজ করছি এটির জন্য এটি অনাকাঙ্ক্ষিত ছিল। আপনি ব্যর্থ AJAX অনুরোধটি ক্যাশে না করতে চাইলে ক্যাচিং পদক্ষেপটি সরিয়ে ফেলতে এক্সপশন ট্রান্সলেশন ফিল্টার এবং "সেন্ডস্টার্ট অ্যাটেনটিকেশন" পদ্ধতিটি ওভাররাইড করার প্রয়োজনীয়তাও পেতে পারেন।

উদাহরণ AjaxAwareAuthenticationEntryPoint:

public class AjaxAwareAuthenticationEntryPoint extends
    LoginUrlAuthenticationEntryPoint {

    public AjaxAwareAuthenticationEntryPoint(String loginUrl) {
        super(loginUrl);
    }

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
        if (isAjax(request)) {
            response.sendError(HttpStatus.UNAUTHORIZED.value(), "Please re-authenticate yourself");
        } else {
        super.commence(request, response, authException);
        }
    }

    public static boolean isAjax(HttpServletRequest request) {
        return request != null && "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
    }
}

সূত্র: ,


3
নীচে ভোটাররা কেন ভোট দিচ্ছেন তা ব্যাখ্যা করলে এটি (আমার পক্ষে) সহায়ক হবে। এই সমাধানে কিছু খারাপ থাকলে আমি আমার ভুলগুলি থেকে শিখতে চাই। ধন্যবাদ।
জন

যদি স্প্রিং ব্যবহার করে এবং জেএসএফ ব্যবহার করে, তবে এটির জন্যও পরীক্ষা করুন: ("আংশিক / এজাক্স")।
জে স্লিক

ব্যবহারকারীরা ভোট দিয়ে থাকতে পারেন কারণ আপনি উল্লেখ করেননি: (1) আপনার ত্রুটির প্রতিক্রিয়া সনাক্ত করতে প্রয়োজনীয় ক্লায়েন্ট-সাইড মোডগুলি; (২) ফিল্টার শৃঙ্খলে আপনার কাস্টমাইজড লগইন ইউআরএলথ্যান্টিকেশন এন্ট্রিপয়েন্টটি যুক্ত করতে স্প্রিং কনফিগারেশনে প্রয়োজনীয় মোডগুলি।
জে স্লিক 21

আপনার উত্তরটি @ আরপ্যাডের মতো একটির মতো। এটি আমার পক্ষে কাজ করেছিল; স্প্রিং সিকিউরিটি ৩.২.৯ ব্যবহার করে। stackoverflow.com/a/8426947/4505142
ড্যারেন পার্কার

11

আমি নিম্নলিখিতটি আমার লগইন.এফপি পৃষ্ঠাতে রেখে সমাধান করেছি।

<script type="text/javascript">
    if (top.location.href.indexOf('login.php') == -1) {
        top.location.href = '/login.php';
    }
</script>

10

@ স্টেগ দ্বারা বর্ণিত হিসাবে আমাকে আবার সমস্যাটি উদ্ধৃত করুন

আমার আপনার একই সমস্যা ছিল। আমি একটি এজ্যাক্স অনুরোধটি সম্পাদন করি যার 2 টি প্রতিক্রিয়া রয়েছে: একটি যা ব্রাউজারটিকে নতুন পৃষ্ঠায় পুনঃনির্দেশ করে এবং একটি যা বর্তমান পৃষ্ঠায় বিদ্যমান এইচটিএমএল ফর্মকে নতুন সাথে প্রতিস্থাপন করে।

আইএমএইচও এটি সত্যই চ্যালেঞ্জ এবং আনুষ্ঠানিকভাবে বর্তমান এইচটিটিপি মান পর্যন্ত প্রসারিত করতে হবে।

আমি বিশ্বাস করি যে নতুন এইচটিপি স্ট্যান্ডার্ডটি একটি নতুন স্ট্যাটাস কোড ব্যবহার করবে। অর্থ: বর্তমানে 301/302ব্রাউজারটিকে এই অনুরোধের সামগ্রীটি নতুনটিতে আনতে বলে location

প্রসারিত মান হিসাবে এটি বলবে যে যদি প্রতিক্রিয়া status: 308(কেবল একটি উদাহরণ) হয় তবে ব্রাউজারটি locationপ্রদত্ত পৃষ্ঠায় মূল পৃষ্ঠাটি পুনর্নির্দেশ করা উচিত ।

বলা হচ্ছে যে; আমি ইতিমধ্যে ভবিষ্যতের এই আচরণটি নকল করতে আগ্রহী , এবং তাই যখন একটি ডকুমেন্ট.আরডাইরেক্টের প্রয়োজন হয় তখন আমার কাছে সার্ভারটি প্রতিক্রিয়া জানায়:

status: 204 No Content
x-status: 308 Document Redirect
x-location: /login.html

যখন জেএস " status: 204" পেয়ে যায়, এটি x-status: 308শিরোনামের অস্তিত্বের জন্য যাচাই করে এবং একটি নথি করে location

এটি কি আপনার কোনও ধারণা রাখে?


7

কিছু নীচের দরকারী হতে পারে:

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

আমি এই কাজটি করেছি:

যে কোনও আজাক্স অনুরোধে আমার সার্ভার একটি জসন 200 প্রতিক্রিয়া ফিরিয়ে দেবে "প্রহরীকে অনুমোদনের প্রয়োজন" (যদি ক্লায়েন্টের অনুমোদনের প্রয়োজন হয়)।

জাভাতে সাধারণ উদাহরণ (সার্ভার সাইড):

@Secured
@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {

    private final Logger m_logger = LoggerFactory.getLogger(AuthenticationFilter.class);

    public static final String COOKIE_NAME = "token_cookie"; 

    @Override
    public void filter(ContainerRequestContext context) throws IOException {        
        // Check if it has a cookie.
        try {
            Map<String, Cookie> cookies = context.getCookies();

            if (!cookies.containsKey(COOKIE_NAME)) {
                m_logger.debug("No cookie set - redirect to login page");
                throw new AuthenticationException();
            }
        }
        catch (AuthenticationException e) {
            context.abortWith(Response.ok("\"NEED TO AUTHENTICATE\"").type("json/application").build());
        }
    }
}

আমার জাভাস্ক্রিপ্টে আমি নিম্নলিখিত কোড যুক্ত করেছি:

$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
    var originalSuccess = options.success;

    options.success = function(data) {
        if (data == "NEED TO AUTHENTICATE") {
            window.location.replace("/login.html");
        }
        else {
            originalSuccess(data);
        }
    };      
});

এবং এটি সম্পর্কে।


5

সার্ভলেট আপনি করা উচিত response.setStatus(response.SC_MOVED_PERMANENTLY); '301' xmlHttp অবস্থা আপনি একটি ফেরৎ জন্য প্রয়োজন পাঠাতে ...

এবং aj .জ্যাক্স ফাংশনে আপনার এই .toString()ফাংশনটি ব্যবহার করা উচিত নয় ..., ঠিক

if (xmlHttp.status == 301) { top.location.href = 'xxxx.jsp'; }

সমস্যাটি এটি খুব নমনীয় নয়, আপনি কোথায় পুনর্নির্দেশ করতে চান তা আপনি ঠিক করতে পারবেন না ..

সার্লেলেটগুলির মাধ্যমে পুনঃনির্দেশ করা সবচেয়ে ভাল উপায় হওয়া উচিত। তবে আমি এখনও এটি করার সঠিক উপায়টি খুঁজে পাচ্ছি না।


5

আমি কেবলমাত্র পুরো পৃষ্ঠার জন্য কোনও এজাক্স অনুরোধে ল্যাচ করতে চেয়েছিলাম। @ সুপর্গ আমাকে শুরু করেছেন। আমি এখানে যা শেষ করেছি তা এখানে:

// redirect ajax requests that are redirected, not found (404), or forbidden (403.)
$('body').bind('ajaxComplete', function(event,request,settings){
        switch(request.status) {
            case 301: case 404: case 403:                    
                window.location.replace("http://mysite.tld/login");
                break;
        }
});

আমি আমার সিদ্ধান্তটির উপর ভিত্তি করে নির্দিষ্ট পোস্টের স্থিতি কোডগুলি বিশেষভাবে পরীক্ষা করতে চেয়েছিলাম। তবে সাফল্য ব্যতীত অন্য যে কোনও কিছু পাওয়ার জন্য আপনি কেবলমাত্র অজ্যাক্স এররকে আবদ্ধ করতে পারেন (২০০ সম্ভবত কেবল?) আমি স্রেফ লিখতে পারতাম:

$('body').bind('ajaxError', function(event,request,settings){
    window.location.replace("http://mysite.tld/login");
}

1
পরে সমস্যা সমাধানে সমস্যা তৈরি করতে অন্য যে কোনও ত্রুটি লুকিয়ে রাখবে
টিম আবেল

1
403 এর অর্থ এই নয় যে ব্যবহারকারী সত্যায়িত নয়, এর অর্থ হ'ল (সম্ভবত প্রমাণীকৃত) ব্যবহারকারীর অনুরোধ করা সংস্থানটি দেখার অনুমতি নেই। সুতরাং এটি লগইন পৃষ্ঠায় পুনর্নির্দেশ করা উচিত নয়
রব

5

আপনি যদি মানগুলিও পাস করতে চান তবে আপনি সেশন ভেরিয়েবলগুলি সেট করতে পারেন এবং যেমন: অ্যাক্সেস করতে পারবেন আপনার জেএসপিতে আপনি লিখতে পারেন

<% HttpSession ses = request.getSession(true);
   String temp=request.getAttribute("what_you_defined"); %>

এবং তারপরে আপনি এই জাতির মানটি আপনার জাভাস্ক্রিপ্ট ভেরিয়েবলে সঞ্চয় করতে পারেন এবং চারপাশে খেলতে পারেন


5

শিরোনাম সমাধানের সাথে আমার কোনও সাফল্য নেই - এগুলি কখনই আমার এজ্যাক্সেস / অজ্যাক্স কমপ্লিট পদ্ধতিতে নেওয়া হয়নি। আমি কাস্টম প্রতিক্রিয়া সহ স্টিগের উত্তরটি ব্যবহার করেছি, তবে আমি জেএসের দিকটি কিছু সংশোধন করেছি। আমি এমন একটি পদ্ধতি সেটআপ করি যা আমি প্রতিটি ফাংশনে কল করি যাতে আমি মানক $.getএবং $.postপদ্ধতিগুলি ব্যবহার করতে পারি ।

function handleAjaxResponse(data, callback) {
    //Try to convert and parse object
    try {
        if (jQuery.type(data) === "string") {
            data = jQuery.parseJSON(data);
        }
        if (data.error) {
            if (data.error == 'login') {
                window.location.reload();
                return;
            }
            else if (data.error.length > 0) {
                alert(data.error);
                return;
            }
        }
    }
    catch(ex) { }

    if (callback) {
        callback(data);
    }
}

এটির ব্যবহারের উদাহরণ ...

function submitAjaxForm(form, url, action) {
    //Lock form
    form.find('.ajax-submit').hide();
    form.find('.loader').show();

    $.post(url, form.serialize(), function (d) {
        //Unlock form
        form.find('.ajax-submit').show();
        form.find('.loader').hide();

        handleAjaxResponse(d, function (data) {
            // ... more code for if auth passes ...
        });
    });
    return false;
}

5

অবশেষে, আমি একটি কাস্টম যুক্ত করে সমস্যাটি সমাধান করি HTTP Header। সার্ভার পক্ষের প্রতিটি অনুরোধের প্রতিক্রিয়া করার ঠিক আগে, আমি প্রতিক্রিয়াটির শিরোনামে বর্তমান অনুরোধ করা url যুক্ত করি।

সার্ভারে আমার অ্যাপ্লিকেশন টাইপ হয় Asp.Net MVCএবং এটি করার জন্য এটির ভাল জায়গা রয়েছে। মধ্যে Global.asaxআমি বাস্তবায়িত Application_EndRequestইভেন্টটি অবশ্যই এত:

    public class MvcApplication : System.Web.HttpApplication
    {

    //  ...
    //  ...

        protected void Application_EndRequest(object sender, EventArgs e)
        {
            var app = (HttpApplication)sender;
            app.Context.Response.Headers.Add("CurrentUrl",app.Context. Request.CurrentExecutionFilePath);
        }

    }

এটা আমার জন্য নিখুঁত কাজ করে! এখন আমার প্রতিটি প্রতিক্রিয়া অনুসারে JQuery $.postঅনুরোধ করা হয়েছে urlএবং অন্যান্য প্রতিক্রিয়া শিরোনাম যা POSTস্থিতি অনুসারে পদ্ধতির ফলাফল হিসাবে আসে 302,303 ...।

এবং অন্যান্য গুরুত্বপূর্ণ বিষয়টি হ'ল সার্ভার সাইডে বা ক্লায়েন্টের পক্ষে কোড পরিবর্তন করার দরকার নেই।

এবং পরেরটি হ'ল পোস্ট ক্রিয়াকলাপের অন্যান্য তথ্যে যেমন ত্রুটি, বার্তা এবং ..., এইভাবে অ্যাক্সেস পাওয়ার ক্ষমতা।

আমি এটি পোস্ট করেছি, সম্ভবত কাউকে সাহায্য করুন :)


4

জ্যাঙ্গো অ্যাপে আমি এই সমস্যাটি নিয়ে আসছিলাম যার সাথে আমি টিঁক দিচ্ছি (দাবি অস্বীকার: আমি শিখতে টিঙ্কার করছি, এবং কোনওভাবেই বিশেষজ্ঞ নই)। আমি যেটি করতে চেয়েছিলাম তা হ'ল jQuery অজ্যাক্সটি কোনও উত্সে একটি মোছার অনুরোধ প্রেরণ করতে, এটি সার্ভারের পাশেই মুছুন, তারপরে হোমপেজে পুনঃনির্দেশ পাঠান। আমি যখন HttpResponseRedirect('/the-redirect/')পাইথন স্ক্রিপ্ট থেকে প্রেরণ করেছি , jQuery এর এজাক্স পদ্ধতি 302 এর পরিবর্তে 200 পাচ্ছিল So সুতরাং, আমি যা করেছি তা 300 এর সাথে একটি প্রতিক্রিয়া পাঠানোর জন্য ছিল:

response = HttpResponse(status='300')
response['Location'] = '/the-redirect/' 
return  response

তারপরে আমি ক্লায়েন্টের কাছে অনুরোধটি jQuery.ajax এর সাথে প্রেরণ / পরিচালনা করেছি:

<button onclick="*the-jquery*">Delete</button>

where *the-jquery* =
$.ajax({ 
  type: 'DELETE', 
  url: '/resource-url/', 
  complete: function(jqxhr){ 
    window.location = jqxhr.getResponseHeader('Location'); 
  } 
});

হতে পারে 300 ব্যবহার করা "সঠিক" নয়, তবে কমপক্ষে এটি ঠিক যেমন কাজ করেছে ঠিক তেমনভাবে কাজ করেছে।

পিএস: এসও এর মোবাইল সংস্করণে সম্পাদনা করার জন্য এটি একটি বিশাল ব্যথা। বোকা ISP আমার পরিষেবাটি বাতিল করার অনুরোধটি যখন আমার উত্তর দিয়ে শেষ হয়েছিল ঠিক তখনই রেখে দেয়!


4

আপনি XMLHttpRequest প্রোটোটাইপ প্রেরণ করতে পারেন এটি এক হ্যান্ডলারের সাথে সমস্ত প্রেরণের জন্য (jQuery / dojo / ইত্যাদি) কাজ করবে।

আমি 500 কোডের মেয়াদোত্তীর্ণ ত্রুটিটি পরিচালনা করতে এই কোডটি লিখেছি, তবে এটি 200 টি পুনর্নির্দেশের ফাঁদে ফেলার জন্য ঠিক একইভাবে কাজ করা উচিত। রেডি উইকিপিডিয়ার এন্ট্রি XMLHttpRequest- এর readyState অর্থ সম্পর্কে onreadystatechange।

// Hook XMLHttpRequest
var oldXMLHttpRequestSend = XMLHttpRequest.prototype.send;

XMLHttpRequest.prototype.send = function() {
  //console.dir( this );

  this.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 500 && this.responseText.indexOf("Expired") != -1) {
      try {
        document.documentElement.innerHTML = this.responseText;
      } catch(error) {
        // IE makes document.documentElement read only
        document.body.innerHTML = this.responseText;
      }
    }
  };

  oldXMLHttpRequestSend.apply(this, arguments);
}

2

অতিরিক্ত হিসাবে আপনি সম্ভবত ব্যবহারকারীদের দেওয়া শিরোনাম URL এ পুনর্নির্দেশ করতে চাইবেন। সুতরাং অবশেষে এটির মতো দেখাবে:

$.ajax({
    //.... other definition
    complete:function(xmlHttp){
        if(xmlHttp.status.toString()[0]=='3'){
        top.location.href = xmlHttp.getResponseHeader('Location');
    }
});

ইউপিডি: অপসারণ। একই কাজ আছে, কিন্তু এটি কাজ করে না। এই জিনিস করছি। আমি যখন এটি সন্ধান করব আমি আপনাকে সমাধানটি দেখাব।


4
এই উত্তরটি লেখককে মুছে ফেলা উচিত কারণ তিনি নিজেই বলেছেন যে এটি কাজ করে না। তিনি পরে একটি কার্যনির্বাহী সমাধান পোস্ট করতে পারেন। -1
TheCrazyProgrammer

ধারণাটি ভাল, তবে সমস্যাটি হ'ল "অবস্থান" শিরোনামটি কখনই পাস হয় না।
মার্টিন Zvarík

আমার সম্পাদনা প্রত্যাখ্যান করা হয়েছিল, সুতরাং ... আপনাকে "var xMLHttp = $ .জ্যাক্স ({...." ব্যবহার করতে হবে ভেরিয়েবলটি ভিতরে থাকতে পারে না ... তারপরে ব্যবহার করুন: কনসোল.লগ (xMLHttp.getAllResponseHeilers ()) ;
মার্টিন জাভার্ক

2

আমি @John এবং @Arpad নিকট থেকে উত্তর ব্যবহার করে একটি কাজ solulion পেয়েছিলাম লিংক এবং @RobWinch লিংক

আমি স্প্রিং সিকিউরিটি 3.2.9 এবং jQuery 1.10.2 ব্যবহার করি।

শুধুমাত্র এজেএক্স অনুরোধগুলি থেকে 4XX প্রতিক্রিয়া সৃষ্টি করার জন্য স্প্রিংয়ের শ্রেণি প্রসারিত করুন:

public class CustomLoginUrlAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {

    public CustomLoginUrlAuthenticationEntryPoint(final String loginFormUrl) {
        super(loginFormUrl);
    }

    // For AJAX requests for user that isn't logged in, need to return 403 status.
    // For normal requests, Spring does a (302) redirect to login.jsp which the browser handles normally.
    @Override
    public void commence(final HttpServletRequest request,
                         final HttpServletResponse response,
                         final AuthenticationException authException)
            throws IOException, ServletException {
        if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
        } else {
            super.commence(request, response, authException);
        }
    }
}

applicationContext-security.xml

  <security:http auto-config="false" use-expressions="true" entry-point-ref="customAuthEntryPoint" >
    <security:form-login login-page='/login.jsp' default-target-url='/index.jsp'                             
                         authentication-failure-url="/login.jsp?error=true"
                         />    
    <security:access-denied-handler error-page="/errorPage.jsp"/> 
    <security:logout logout-success-url="/login.jsp?logout" />
...
    <bean id="customAuthEntryPoint" class="com.myapp.utils.CustomLoginUrlAuthenticationEntryPoint" scope="singleton">
        <constructor-arg value="/login.jsp" />
    </bean>
...
<bean id="requestCache" class="org.springframework.security.web.savedrequest.HttpSessionRequestCache">
    <property name="requestMatcher">
      <bean class="org.springframework.security.web.util.matcher.NegatedRequestMatcher">
        <constructor-arg>
          <bean class="org.springframework.security.web.util.matcher.MediaTypeRequestMatcher">
            <constructor-arg>
              <bean class="org.springframework.web.accept.HeaderContentNegotiationStrategy"/>
            </constructor-arg>
            <constructor-arg value="#{T(org.springframework.http.MediaType).APPLICATION_JSON}"/>
            <property name="useEquals" value="true"/>
          </bean>
        </constructor-arg>
      </bean>
    </property>
</bean>

আমার জেএসপিগুলিতে, এখানে প্রদর্শিত হিসাবে একটি গ্লোবাল AJAX ত্রুটি হ্যান্ডলার যুক্ত করুন

  $( document ).ajaxError(function( event, jqxhr, settings, thrownError ) {
      if ( jqxhr.status === 403 ) {
          window.location = "login.jsp";
      } else {
          if(thrownError != null) {
              alert(thrownError);
          } else {
              alert("error");
          }
      }
  });

এছাড়াও, জেএসপি পৃষ্ঠাগুলিতে এজেএক্স কলগুলি থেকে বিদ্যমান ত্রুটি হ্যান্ডলারগুলি সরিয়ে দিন:

        var str = $("#viewForm").serialize();
        $.ajax({
            url: "get_mongoDB_doc_versions.do",
            type: "post",
            data: str,
            cache: false,
            async: false,
            dataType: "json",
            success: function(data) { ... },
//            error: function (jqXHR, textStatus, errorStr) {
//                 if(textStatus != null)
//                     alert(textStatus);
//                 else if(errorStr != null)
//                     alert(errorStr);
//                 else
//                     alert("error");
//            }
        });

আমি আশা করি এটি অন্যকে সহায়তা করে।

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

Update2 ব্যবহার করার পরিবর্তে always-use-default-target="true", ব্যবহার @RobWinch requstCache থেকে AJAX অনুরোধ ব্লক উদাহরণ। এটি লগইন করার পরে সাধারণ লিঙ্কগুলিকে তাদের মূল টার্গেটে পুনঃনির্দেশের অনুমতি দেয় তবে এজেএক্স লগইন করার পরে হোম পৃষ্ঠায় যায়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.