JQuery අජැක්ස් ඇමතුමකින් පසු යළි-යොමුවීමේ ඉල්ලීමක් කළමනාකරණය කරන්නේ කෙසේද


1380

මම භාවිතා $.post()කරන්නේ අජැක්ස් භාවිතයෙන් සර්වට්ලට් එකක් ඇමතීමට සහ එහි ප්‍රති ing ලයක් ලෙස ඇති HTML කැබැල්ල භාවිතා divකර පරිශීලකයාගේ වත්මන් පිටුවෙහි මූලද්‍රව්‍යයක් ආදේශ කිරීමට ය . කෙසේ වෙතත්, සැසිය කල් ඉකුත්වුවහොත්, සේවාදායකයා පරිශීලක පිවිසුම් පිටුවට යැවීම සඳහා යළි-යොමුවීම් නියෝගයක් යවයි. මෙම අවස්ථාවෙහිදී, jQuery මඟින් divමූලද්‍රව්‍යය පිවිසුම් පිටුවේ අන්තර්ගතය සමඟ ප්‍රතිස්ථාපනය කරමින් පරිශීලකයාගේ ඇස්වලට දුර්ලභ දර්ශනයක් දැකීමට බල කරයි.

JQuery 1.2.6 සමඟ අජැක්ස් ඇමතුමකින් යළි-යොමුවීම් විධානයක් කළමනාකරණය කරන්නේ කෙසේද?


1
(එවැනි පිළිතුරක් නොවේ) - මම මෙය අතීතයේ සිදු කළේ jquery පුස්තකාලය සංස්කරණය කිරීමෙන් සහ එක් එක් XHR හි පුරනය වීමේ පිටුව සඳහා චෙක්පතක් එක් කිරීමෙන් ය. හොඳම විසඳුම නොවේ, මන්ද ඔබ යාවත්කාලීන කරන සෑම අවස්ථාවකම එය කළ යුතු නමුත් එය ගැටළුව විසඳයි.
සුගන්ද්‍රන්

1
අදාළ ප්‍රශ්නය බලන්න: stackoverflow.com/questions/5941933/…
Nutel

මෙම HttpContext.Response.AddHeaderajaxsetup sucess දී සහ චෙක් යන්න මාර්ගය වන්නේ
LCJ

4
සේවාදායකයට 401 ආපසු ලබා දිය නොහැක්කේ ඇයි? එවැනි අවස්ථාවක ඔබට ගෝලීය $ .ajaxSetup එකක් තිබිය හැකි අතර පිටුව හරවා යැවීමට තත්ව කේතය භාවිතා කරන්න.
විශාල්

1
මෙම සබැඳිය doanduyhai.wordpress.com/2012/04/21/… මට නිවැරදි විසඳුමක් ලබා දෙයි
pappu_kutty

Answers:


701

මම මෙම ප්‍රශ්නය කියවා ප්‍රතිචාර HTTP තත්ව කේතය සැකසීම සම්බන්ධයෙන් ප්‍රකාශ කර ඇති ප්‍රවේශය ක්‍රියාත්මක කළෙමි බ්‍රව්සරය විනිවිද පෙනෙන ලෙස යළි-යොමුවීම් වලක්වා ගැනීම සඳහා 278 ලෙස . මෙය ක්‍රියාත්මක වුවද, එය ටිකක් කප්පාදුවක් බැවින් මම ටිකක් අතෘප්තිමත් විය.

වැඩිපුර කැණීම් කිරීමෙන් පසුව, මම මෙම ප්‍රවේශය අතහැර දමා JSON භාවිතා කළෙමි . මෙම අවස්ථාවෙහිදී, AJAX ඉල්ලීම් සඳහා වන සියළුම ප්‍රතිචාර වල තත්ව කේතය 200 ක් ඇති අතර ප්‍රතිචාරයේ සිරුරෙහි සේවාදායකය මත ගොඩනගා ඇති JSON වස්තුවක් අඩංගු වේ. සේවාදායකයේ ඇති ජාවාස්ක්‍රිප්ටයට JSON වස්තුව භාවිතා කර එය කළ යුතු දේ තීරණය කළ හැකිය.

මට ඔයාට සමාන ප්‍රශ්නයක් තිබුණා. මම ප්‍රතිචාර 2 ක් ඇති AJAX ඉල්ලීමක් ඉටු කරමි: බ්‍රව්සරය නව පිටුවකට හරවා යැවීම සහ වත්මන් පිටුවෙහි පවතින HTML පෝරමයක් නව එකක් සමඟ ප්‍රතිස්ථාපනය කිරීම. මෙය කිරීමට 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 වස්තුව "දත්ත" සේවාදායකයන් දෙදෙනෙකු සඳහා සේවාදායකයේ ඉදිකර ඇත: data.redirectසහ data.form. මෙම ප්‍රවේශය වඩා හොඳ බව මට පෙනී ගියේය.


58
Stackoverflow.com/questions/503093/… හි විසඳුමේ සඳහන් පරිදි window.location.replace (data.redirect) භාවිතා කිරීම වඩා හොඳය; window.location.href = data.redirect;
කාලල්ස් බැරෝබස්

8
ක්‍රියාව සඳහා HTTP කේත භාවිතා කිරීම වඩා හොඳ නොවීමට ඕනෑම හේතුවක්. උදාහරණයක් ලෙස HTTP තාවකාලික යළි-යොමුවීමක් වන 307 කේතයක්?
සර්ජි ගොලෝස්

16
Er සර්ජි ගොලෝස් හේතුව ඔබ HTTP යළි-යොමුවීමක් කරන්නේ නම්, යළි-යොමුවීම කිසි විටෙකත් අජැක්ස් සාර්ථක ඇමතුම් සඳහා නොපැමිණීමයි. යළි-යොමුවීමේ ගමනාන්තයේ අන්තර්ගතය සමඟ කේත 200 ක් ලබා දෙන බ්‍රව්සරය යළි-යොමුවීම් ක්‍රියාවට නංවයි.
මිගෙල් සිල්වා

2
සේවාදායක කේතය මොන වගේද? data.form සහ data.redirect හි ප්‍රතිලාභ අගයක් ලබා ගැනීමට. මූලික වශයෙන් මම එහි යළි-යොමුවීමක් දැම්මාදැයි තීරණය කරන්නේ කෙසේද?
Vnge

6
මෙය සේවාදායකයේ සිදු කරන්නේ කෙසේදැයි පෙන්වා ඇත්නම් මෙම පිළිතුර වඩාත් ප්‍රයෝජනවත් වනු ඇත.
පේද්‍රෝ හෝල් කාර්වාල්හෝ

245

මම මෙම ගැටළුව විසඳුවේ:

  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
මොනතරම් විශිෂ්ට විසඳුමක්ද? එක්-නැවතුම් විසඳුමක අදහසට මම කැමතියි. මට 403 තත්වයක් තිබේදැයි පරීක්ෂා කිරීමට අවශ්‍යය, නමුත් මට මේ සඳහා ශරීරයේ අජැක්ස් සක්සස් බන්ධනය භාවිතා කළ හැකිය (මෙය මම සැබවින්ම සොයන දෙයයි.) ස්තූතියි.
බ්‍රෙටිකස්

4
මම මෙය කළ අතර මට $ .get () ශ්‍රිතය භාවිතා කරන තැනට ajaxComplete අවශ්‍ය බව සොයා ගත් අතර 200 හැර වෙනත් කිසිදු තත්වයක් වෙඩි තැබීමක් සිදු නොවීය. ඇත්ත වශයෙන්ම, මට ඒ වෙනුවට අජැක්ස් දෝෂයට බැඳී සිටිය හැකිය. වැඩි විස්තර සඳහා මගේ පිළිතුර පහත බලන්න.
බ්‍රෙටිකස්

2
බොහෝ අවස්ථාවන්හිදී එය කමක් නැත, නමුත් ඔබේ රාමුව අවසරය හසුරුවන්නේ නම් කුමක් කළ යුතුද?
ජවාලිස්කෝ

13
මම ශීර්ෂක ප්‍රවේශයට කැමතියි - @ mwoods79 වැනි - නැවත හරවා යැවිය යුතු ස්ථානය පිළිබඳ දැනුම අනුපිටපත් නොකළ යුතු යැයි සිතමි. මම එය විසඳුවේ බූලියන් වෙනුවට REDIRECT_LOCATION ශීර්ෂයක් එක් කිරීමෙනි.
rintcius

3
යළි-යොමුවීමෙන් පසු ප්‍රතිචාරය මත ශීර්ෂකය සැකසීමට සැලකිලිමත් වන්න. මෙම පිටුවේ වෙනත් පිළිතුරු වල විස්තර කර ඇති පරිදි, යළි-යොමුවීම අජැක්ස් සූක්ස් හසුරුවන්නාට විනිවිද පෙනෙන විය හැකිය. මේ අනුව මම පිවිසුම් පිටුවේ GET ප්‍රතිචාරයට ශීර්ෂකය ඇතුළත් කළෙමි (එය අවසානයේදී සහ මගේ තත්වය තුළ අජැක්ස් සාර්ථකත්වය අවුලුවන).
sieppl

118

කිසිදු බ්‍රව්සරයක් ප්‍රතිචාර 301 සහ 302 නිවැරදිව හසුරුවන්නේ නැත. ඇත්ත වශයෙන්ම ප්‍රමිතිය පවා ඔවුන් “විනිවිදභාවයෙන්” හැසිරවිය යුතු යැයි පවසන අතර එය අජැක්ස් පුස්තකාල වෙළෙන්දන්ට විශාල හිසරදයකි. දී රා-Ajax අපි විනිවිද පෙනෙන, සේවාදායකය වෙතින් යළි-යොමුකරයි හැසිරවීමට HTTP ප්රතිචාර තත්ත්වය කේතය 278 (ටිකක් "භාවිතා නොකරන" සාර්ථකත්වය කේතය) භාවිතා කරමින් බවට බල කරන ලදි ...

මෙය මට ඇත්තෙන්ම කරදරයක් වන අතර, මෙහි යමෙකුට W3C හි යම් “අදින්නක්” තිබේ නම්, අපි 301 සහ 302 කේතයන් අප විසින්ම හැසිරවිය යුතු බව ඔබට W3C ට දැනුම් දිය හැකි බව මම අගය කරමි ...! ;)


3
මම එක් පියවරක් සඳහා 278 නිල HTTP පිරිවිතරයට වඩා වෙනස් විය යුතුය.
ක්‍රිස් මාරිසික්

2
එය දැනටමත් ඒවා විනිවිදභාවයෙන් යුතුව හැසිරෙන්නේ නැද්ද? සම්පතක් ගෙන ගොස් ඇත්නම්, එය විනිවිදභාවයෙන් යුතුව හැසිරවීම යන්නෙන් අදහස් කරන්නේ ලබා දී ඇති URL හි ඉල්ලීම නැවත කිරීම ය. XMLHttpRequest API භාවිතා කිරීමට මා බලාපොරොත්තු වන්නේ එයයි.
පිලිප් රාතේ

@ පිලිප් රාත් එකඟයි. විනිවිද පෙනෙන ලෙස හැසිරවීම මට අවශ්‍ය දේ පමණයි. එය නරක යැයි සලකන්නේ මන්දැයි මම නොදනිමි.
smwikipedia

wsmwikipedia පිටුව නැවත හරවා යැවීමකින් තොරව ප්‍රධාන කොටසේ සලකුණු නැවත හරවා යැවීමට කටයුතු කිරීම.
cmc

මෙහි යමෙකුට W3C හි යම් “අදින්න” තිබේ නම්, අපි 301 සහ 302 කේතයන් අප විසින්ම හැසිරවිය යුතු බව ඔබට W3C ට දැනුම් දිය හැකි බව මම අගය කරමි ...! ;)
ටොමී.ටැන්ග්

100

අවසානයේදී ක්‍රියාත්මක කරන ලද විසඳුම වූයේ අජැක්ස් ඇමතුමේ ඇමතුම් ආපසු ලබා ගැනීමේ කාර්යය සඳහා එතුම භාවිතා කිරීම සහ ආපසු එවන ලද HTML කැබැල්ලේ නිශ්චිත මූලද්‍රව්‍යයක් පවතින්නේද යන්න පරීක්ෂා කිරීම සඳහා ය. මූලද්රව්යය සොයා ගත්තේ නම්, එතීම නැවත හරවා යැවීමක් සිදු කරයි. එසේ නොවේ නම්, එතුම ඇමතුම සත්‍ය ඇමතුම් ලබා ගැනීමේ කාර්යයට යොමු කළේය.

උදාහරණයක් ලෙස, අපගේ එතීමේ කාර්යය මෙවැනි දෙයක් විය:

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"
);

මෙය අප වෙනුවෙන් වැඩ කළේ සියලුම අජැක්ස් ඇමතුම් සෑම විටම පිටුවේ කොටසක් ප්‍රතිස්ථාපනය කිරීමට අප භාවිතා කරන DIV අංගයක් තුළ HTML නැවත ලබා දුන් බැවිනි. එසේම, අපට අවශ්‍ය වූයේ පිවිසුම් පිටුවට හරවා යැවීම පමණි.


4
මෙය cbWrapper (funct) {return function (data) {if ($ ("# myForm", data) .size ()> 0) .size ()> 0) to.location.href = "login" ලෙස කෙටි කළ හැකි බව සලකන්න. වෙනත් ක්‍රියාකාරී (දත්ත); }}. ඔබට අවශ්‍ය වන්නේ .post ඇමතීමේදී cbWrapper (myActualCB) පමණි. ඔව්, අදහස් දැක්වීමේ කේතය අවුල් සහගත නමුත් එය සටහන් කළ යුතුය :)
සිමෙන් එචෝල්ට්

ඔබ ප්රමාණය වෙනුවට මෙහි .length භාවිතා කළ හැකි නිසා ප්රමාණය ක්ෂය වේ
සුනිල්

67

මම ලෙමන් වල සුළු පෙරළියක් සහිත ටිමර්ස්ගේ ක්‍රමයට කැමතියි. ඔබ කවදා හෝ ආපසු ලබා නම් 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';
}

මම පහත් මට්ටමේ දේවල් වළක්වා ගැනීමට උත්සාහ කළෙමි. කෙසේ වෙතත්, ඔබ විස්තර කරන දේ වැනි දෙයක් මම භාවිතා කරමි යැයි සිතමු, HTTP කේතය 3xx බව හඳුනාගත් පසු මම බ්‍රව්සරය හරවා යැවීමට බල කරන්නේ කෙසේද? මගේ ඉලක්කය වන්නේ පරිශීලකයා ඔහුගේ / ඇයගේ සැසිය කල් ඉකුත් වී ඇති බව ප්‍රකාශ කිරීම පමණක් නොව, ඔහු නැවත හරවා යැවීමයි.
එලියට් වර්ගාස්

4
Btw, $ .ajax () ඉතා පහත් මට්ටමක නැත. Q .ajax සහ එහි සියලු විකල්ප වලට වඩා බෙහෙවින් සරල වන $ .get, $ .post යනාදිය ඇති බැවින් එය jQuery අනුව පහත් මට්ටමක පවතී.
තුරු

16
ඔහ් කොල්ලා! කණගාටුයි මට ඔබේ පිළිතුර "පිළිගැනීමට" සිදු විය, එය තවමත් ඉතා ප්‍රයෝජනවත් වේ. කාරණය නම්, යළි-යොමුවීම් ස්වයංක්‍රීයව කළමනාකරණය කරනු ලබන්නේ XMLHttpRequest විසිනි, එබැවින් නැවත හරවා යැවීමෙන් පසු මට සෑම විටම 200 තත්ව කේතයක් ලැබේ (සුසුම්ලමින්!). මම හිතන්නේ මට HTML විග්‍රහ කිරීම වැනි නරක දෙයක් කිරීමට සිදුවනු ඇති අතර සලකුණු කාරකයක් සොයනු ඇත.
එලියට් වර්ගාස්

1
කුතුහලය දනවන කරුණ නම්, සැසිය සේවාදායකයෙන් අවසන් වුවහොත්, එයින් අදහස් කරන්නේ සේවාදායකයා වෙනත් SESSIONID යවන බවක් නොවේද? අපට එය හඳුනාගත නොහැකිද?
සලාමන්ඩර් 2007

10
සටහන: මෙය යළි-යොමුවීම් සඳහා ක්‍රියා නොකරයි. ajax නව පිටුවට ගොස් එහි තත්ව කේතය නැවත ලබා දෙනු ඇත.

33

මට අවශ්‍ය වූයේ මගේ ප්‍රවේශය බෙදා ගැනීමට මෙය කෙනෙකුට උදව් විය හැකි බැවිනි:

මම මූලිකවම ජාවාස්ක්‍රිප්ට් මොඩියුලයක් ඇතුළත් කර ඇති අතර එය පරිශීලක නාමය ප්‍රදර්ශනය කිරීම වැනි සත්‍යාපන දේවල් හසුරුවයි. තවද මෙම අවස්ථාව පිවිසුම් පිටුවට යළි- යොමුවීම හසුරුවයි. .

මගේ තත්වය: අප සතුව මූලික වශයෙන් අයිඑස්ඒ සේවාදායකයක් ඇති අතර එය සියලු ඉල්ලීම්වලට සවන් දෙන අතර 302 සහ ස්ථාන ශීර්ෂයක් සමඟ ප්‍රතිචාර දක්වයි අපගේ පිවිසුම් පිටුවට .

මගේ ජාවාස්ක්‍රිප්ට් මොඩියුලය තුළ මගේ ආරම්භක ප්‍රවේශය සමාන විය

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

ගැටළුව (මෙහි බොහෝ දෙනා දැනටමත් සඳහන් කර ඇති පරිදි) බ්‍රව්සරය විසින්ම යළි-යොමුවීම් හසුරුවනුයේ ඒ නිසා මගේ ajaxCompleteඇමතුම කිසි විටෙකත් නොපැමිණියේය, නමුත් ඒ වෙනුවට දැනටමත් හරවා යවා ඇති පිවිසුම් පිටුවේ ප්‍රතිචාරය මට ලැබුණි .status 200 . ගැටළුව: සාර්ථක 200 ප්‍රතිචාරය ඔබේ සත්‍ය පිවිසුම් පිටුවද නැතිනම් වෙනත් අත්තනෝමතික පිටුවක්ද යන්න ඔබ හඳුනා ගන්නේ කෙසේද ??

විසඳුම

යළි-යොමුවීම් ප්‍රතිචාර 302 ක් ග්‍රහණය කර ගැනීමට මට නොහැකි වූ නිසා, මම LoginPageමගේ පිවිසුම් පිටුවේ ශීර්ෂයක් එක් කළ අතර එහි පිවිසුම් පිටුවේ url එක අඩංගු විය. මොඩියුලයේ මම දැන් ශීර්ෂයට සවන් දී යළි-යොමුවීමක් කරන්නෙමි:

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

... එය චාම් ලෙස ක්‍රියා කරයි :). මම යූආර්එල් LoginPageශීර්ෂයට ඇතුළත් කරන්නේ මන්දැයි ඔබ කල්පනා කළ හැකිය ... මූලික වශයෙන් වස්තුවෙන් GETස්වයංක්‍රීයව යළි හරවා යැවීමේ ප්‍රති result ලයක් ලෙස යූආර්එල් තීරණය කිරීමට මට ක්‍රමයක් සොයාගත නොහැකි විය xhr...


+1 - නමුත් අභිරුචි ශීර්ෂයන් ආරම්භ විය X-යුතු බැවින් භාවිතා කිරීමට වඩා හොඳ ශීර්ෂයක් වනු ඇත X-LoginPage: http://example.com/login.
uınbɐɥs

6
Ha ෂාකින්ට්‍රිෆොනොෆ් තවත් නැත. මම X- උපසර්ගය භාවිතා නොකළේ 2011 ජුනි මාසයේදී ITEF ලේඛනයක් විසින් ඒවා ඉවත් කිරීම යෝජනා කළ අතර ඇත්ත වශයෙන්ම 2012 ජුනි මාසය සමඟ අභිරුචි ශීර්ෂයන් තවදුරටත් උපසර්ගගත නොකළ යුතු බව නිල නොවන X-බැවිනි.
ජූරි

අපට ISA සේවාදායකයක් ද ඇති අතර මම එකම ගැටලුවකට මුහුණ දුන්නෙමි. කේතයෙන් එය වටා වැඩ කරනවා වෙනුවට, යළි- යොමුවීම නැවැත්වීම සඳහා අයිඑස්ඒ වින්‍යාස කිරීමට අපි kb2596444 හි උපදෙස් භාවිතා කළෙමු .
ස්කොට් ගල්

29

මෙම මාතෘකාව පැරණි බව මම දනිමි, නමුත් මම මෙහි සොයාගත් සහ කලින් විස්තර කර ඇති තවත් ප්‍රවේශයක් දෙන්නෙමි . මූලික වශයෙන් මම WIF සමඟ ASP.MVC භාවිතා කරමි (නමුත් මෙම මාතෘකාවේ සන්දර්භය සඳහා මෙය සැබවින්ම වැදගත් නොවේ - කුමන රාමු භාවිතා කළද පිළිතුර ප්‍රමාණවත් නොවේ. හෝඩුවාව නොවෙනස්ව පවතී - අජැක්ස් ඉල්ලීම් සිදුකරන අතරතුර සත්‍යාපන අසමත්වීම් සම්බන්ධ ගැටළු සමඟ කටයුතු කරයි ) .

පහත දැක්වෙන ප්‍රවේශය කොටුවෙන් පිටත ඇති සියලුම අජැක්ස් ඉල්ලීම් සඳහා යොදා ගත හැකිය (ඒවා පැහැදිලිවම සිදුවීමට පෙර නැවත අර්ථ දැක්වීමක් නොකරන්නේ නම්).

$.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ඉල්ලීම අනුව යූආර්එල් මගින් මගේ රාමුව මඟින් ස්වයංක්‍රීයව හසුරුවනු ලැබේ).

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 සිද්ධිය භාවිතා කිරීමෙන් මම ගැටලුව විසඳුවා.
ෆ්රිනවාල්

@ ජැරොස්ලාවාලිස්කෝ මම මගේ අවසාන පිළිතුරට වැරදි සිදුවීමක් අලවා තැබුවෙමි! මම අදහස් කළේ PreSendRequestHeaders සිද්ධිය ..... PostAuthenticateRequest නොවේ! >> බ්ලෂ් << මගේ වැරැද්ද පෙන්වා දීම ගැන ස්තූතියි.
ෆ්රිනවාල්

@ ජැරෝස්ලාවාලිස්කෝ WIF භාවිතා කරන විට ඔබට AJAX ඉල්ලීම් සඳහා ප්‍රතිචාර 401 ක් ආපසු ලබා දිය හැකි අතර ඔබේ ජාවාස්ක්‍රිප්ට් මේවා හැසිරවීමට ඉඩ දෙන්න. එසේම ඔබ උපකල්පනය කරන්නේ සියලුම 302 ට සත්‍යාපනය අවශ්‍ය වන අතර එය සෑම අවස්ථාවකම සත්‍ය නොවන බවයි. කවුරුහරි කැමති නම් මම පිළිතුරක් එකතු කර ඇත්තෙමි.
රොබ්

26

මෙය හැසිරවීමට වඩා හොඳ ක්‍රමයක් වන්නේ දැනට පවතින HTTP ප්‍රොටොකෝලය ප්‍රතිචාර කේත උත්තේජනය කිරීමයි 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';
    }
    });

IMO මෙය වඩාත් සාමාන්‍ය වන අතර ඔබ නව අභිරුචි පිරිවිතර / ශීර්ෂයක් ලියන්නේ නැත. ඔබගේ දැනට පවතින අජැක්ස් ඇමතුම් කිසිවක් වෙනස් කිරීමට ඔබට අවශ්‍ය නොවිය යුතුය.

සංස්කරණය කරන්න: per @ රොබ්ගේ අදහස් පහතින්, 401 (සත්‍යාපන දෝෂ සඳහා HTTP තත්ව කේතය) දර්ශකය විය යුතුය. වැඩි විස්තර සඳහා 403 තහනම් එදිරිව 401 අනවසර HTTP ප්‍රතිචාර බලන්න . සමහර වෙබ් රාමු සත්‍යාපනය සහ බලය පැවරීමේ දෝෂ සඳහා 403 භාවිතා කරයි - එබැවින් ඒ අනුව අනුගත වන්න. ස්තූතියි රොබ්.


මම එකම ප්රවේශය භාවිතා කරමි. JQuery ඇත්ත වශයෙන්ම 403 දෝෂ කේතයෙන් ajaxSuccess අමතන්නේද? මම හිතන්නේ ඇත්ත වශයෙන්ම අවශ්‍ය වන්නේ අජැක්ස් දෝෂ කොටස පමණි
මාරියස් බැලෙටිස්

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

AjaxComplete හි, ප්‍රතිචාරයේ යළි-යොමුවීමක් තිබේ නම්, එය යළි-යොමුවීමක් විය යුතුය, එබැවින් බ්‍රව්සරයේ ස්ථානය වෙනස් කරන්න.

$('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 );
        };
    });
});

මම html ටැගය තිබේදැයි පරීක්ෂා කර බැලුවද, ඔබේ පිවිසුම් පිටුවේ ඇති ඕනෑම අද්විතීය නූලක් සෙවීම සඳහා ඔබට දර්ශකය වෙනස් කළ හැකිය ...


මෙය මට වැඩ කරන බවක් නොපෙනේ, එය අජැක්ස් ඇමතුමකින් අර්ථ දක්වා ඇති ශ්‍රිතය නොකඩවා අමතයි, එය සාර්ථක ක්‍රමවේදය ඉක්මවා නොයන බවක් පෙනේ.
adriaanp

අවම වශයෙන් තවදුරටත් මට වැඩ කරන බවක් නොපෙනේ. හැකි පැහැදිලි කිරීමක් මෙහි: stackoverflow.com/a/12010724/260665
රාජ් පවන් ගුම්ඩාල්

20

මා සොයාගත් තවත් විසඳුමක් (ඔබට ගෝලීය හැසිරීමක් සැකසීමට අවශ්‍ය නම් විශේෂයෙන් ප්‍රයෝජනවත් වේ) දේපල සමඟ $.ajaxsetup()ක්‍රමවේදය භාවිතා කිරීම . අනෙක් අය පෙන්වා දුන් පරිදි, යළි-යොමුවීමේ තත්ව කේතය ( ) භාවිතා නොකරන්න , ඒ වෙනුවට තත්ව කේතයක් භාවිතා කර නැවත හරවා යැවීමේ සේවාදායකයාගේ පැත්ත හසුරුවන්න.statusCode3xx4xx

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

400ඔබට හැසිරවීමට අවශ්‍ය තත්ව කේතය සමඟ ප්‍රතිස්ථාපනය කරන්න . දැනටමත් සඳහන් කර ඇති පරිදි 401 Unauthorizedහොඳ අදහසක් විය හැකිය. මම භාවිතා 400එය ඉතා unspecific කිරීමේ සිට මම එය භාවිතා කළ හැක 401වඩා විශේෂිත අවස්ථා (වැරදි පිවිසුම් අක්තපත්ර වැනි) සඳහා. එබැවින් සෘජුවම යළි හරවා යැවීම වෙනුවට 4xxසැසිය කල් ඉකුත් වූ විට ඔබේ පසුපෙළ දෝෂ කේතයක් ලබා දිය යුතු අතර ඔබ යළි-යොමුවීමේ සේවාදායකයාගේ පැත්ත හසුරුවයි. Backbone.js වැනි රාමු සමඟ වුවද මට පරිපූර්ණව ක්‍රියා කරයි


පිටුවේ ශ්‍රිතය සඳහන් කළ යුත්තේ කොතැනින්ද?
වික්‍රන්ත්

Ik වික්‍රන්ට් මම ඔබේ ප්‍රශ්නය නිවැරදිව තේරුම් ගත්තා නම්, ඔබට jQuery පැටවූ වහාම සහ ඔබේ සැබෑ ඉල්ලීම් කිරීමට පෙර ශ්‍රිතය අමතන්න.
morten.c

19

ලබා දී ඇති විසඳුම් බොහොමයක් වැඩිපුර ශීර්ෂයක් හෝ නුසුදුසු HTTP කේතයක් භාවිතා කරමින් ක්‍රියාමාර්ගයක් භාවිතා කරයි. එම විසඳුම් බොහෝ විට ක්‍රියාත්මක වනු ඇති නමුත් මඳක් 'අනවසරයෙන්' දැනෙනු ඇත. මම තවත් විසඳුමක් ඉදිරිපත් කර ඇත්තෙමි.

අපි 401 ප්‍රතිචාරයක් මත හරවා යැවීම සඳහා වින්‍යාස කර ඇති WIF භාවිතා කරමු (passiveRedirectEnabled = "true"). සාමාන්‍ය ඉල්ලීම් හැසිරවීමේදී යළි-යොමුවීම ප්‍රයෝජනවත් වන නමුත් AJAX ඉල්ලීම් සඳහා ක්‍රියා නොකරනු ඇත (බ්‍රව්සර් 302 / යළි-යොමුවීම් ක්‍රියාත්මක නොකරන බැවින්).

ඔබගේ global.asax හි පහත කේතය භාවිතා කිරීමෙන් ඔබට AJAX ඉල්ලීම් සඳහා යළි-යොමුවීම අක්‍රිය කළ හැකිය:

    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 ක් විසි වන අතර එය WIF විසින් හසුරුවනු ඇත (සහ WIF පරිශීලකයා පිවිසුම් පිටුවට හරවා යවනු ඇත).

දෝෂ 401 ක් හැසිරවීමට javascript සඳහා උදාහරණයක්:

$(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

ASP.NET MVC RedirectToAction ක්‍රමය භාවිතා කිරීමෙන් පසුව මෙම ගැටළුව දිස්විය හැකිය. පෝරමය ඩිව් හි පෙන්වීම වැළැක්වීම සඳහා ඔබට $ .ajaxSetup සමඟ නොගැලපෙන ප්‍රතිචාර සඳහා යම් ආකාරයක අජැක්ස් ප්‍රතිචාර පෙරණයක් කළ හැකිය . ප්‍රතිචාරයේ MVC යළි-යොමුවීමක් තිබේ නම් ඔබට මෙම ප්‍රකාශනය JS පැත්තේ තක්සේරු කළ හැකිය. JS සඳහා උදාහරණ කේතය පහත:

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

දත්ත නම්: ඉහත "filter.location = '/ Acount / Login'" මඟින් එය අල්ලා දත්ත ප්‍රදර්ශනය කිරීමට ඉඩ නොදී නැවත හරවා යැවීම ඇගයීමට ලක් කරනු ඇත.


dataප්‍රතිචාර ශරීරයේ හෝ ශීර්ෂයේ තිබේද?
GMsoF

16

ව්ලැඩිමීර් ප්‍රඩ්නිකොව් සහ තෝමස් හැන්සන් පැවසූ දේ එකට එකතු කිරීම:

  • එය XHR දැයි හඳුනා ගැනීමට ඔබේ සේවාදායක පැත්තේ කේතය වෙනස් කරන්න. එය එසේ නම්, යළි-යොමුවීමේ ප්‍රතිචාර කේතය 278 ලෙස සකසන්න. Django හි:
   if request.is_ajax():
      response.status_code = 278

මෙමඟින් බ්‍රව්සරය ප්‍රතිචාරය සාර්ථක ලෙස සලකන අතර එය ඔබගේ ජාවාස්ක්‍රිප්ට් වෙත භාර දෙන්න.

  • ඔබගේ JS හි, ආකෘති පත්‍රය ඉදිරිපත් කිරීම අජැක්ස් හරහා බවට වග බලා ගන්න, ප්‍රතිචාර කේතය පරීක්ෂා කර අවශ්‍ය නම් නැවත හරවා යැවීම:
$('#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";
        }
    });

එය පිවිසුම් පිටුවට දමන්න. එය ප්‍රධාන පිටුවෙහි ඩිවි එකක පටවා ඇත්නම්, එය පිවිසුම් පිටුව දක්වා හරවා යවනු ඇත. "#site" යනු පිවිසුම් පිටුව හැර අනෙකුත් සියලුම පිටුවල පිහිටා ඇති div එකක හැඳුනුම්පතකි.


12

ඔබ වසන්ත ආරක්‍ෂාව භාවිතා කරන්නේ නම් පිළිතුරු මිනිසුන් සඳහා වැඩ කරන බවක් පෙනෙන්නට තිබුණද, මම LoginUrlAuthenticationEntryPoint විස්තාරණය කර AJAX වඩාත් ශක්තිමත් ලෙස හැසිරවීමට නිශ්චිත කේතයක් එක් කර ඇත්තෙමි. බොහෝ නිදසුන් සත්‍යාපන අසමත්වීම් පමණක් නොව සියලු යළි-යොමුවීම් වලට බාධා කරයි. මා වැඩ කරන ව්‍යාපෘතිය සඳහා මෙය නුසුදුසු විය. අසාර්ථක AJAX ඉල්ලීම හැඹිලිගත කිරීමට ඔබට අවශ්‍ය නැතිනම් හැඹිලි පියවර ඉවත් කිරීම සඳහා ExceptionTranslationFilter දිගු කර "sendStartAuthentication" ක්‍රමය ඉක්මවා යාමේ අවශ්‍යතාවය ඔබට සොයාගත හැකිය.

උදාහරණ 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"));
    }
}

මුලාශ්‍ර: 1 , 2


3
පහත් ඡන්දදායකයින් තමන් ඡන්දය ප්‍රකාශ කිරීමට හේතුව පැහැදිලි කරන්නේ නම් එය මට ප්‍රයෝජනවත් වනු ඇත. මෙම විසඳුමේ නරක දෙයක් තිබේ නම් මම මගේ වැරදිවලින් ඉගෙන ගැනීමට කැමතියි. ස්තූතියි.
ජෝන්

වසන්තය භාවිතා කරන්නේ නම් සහ ජේඑස්එෆ් භාවිතා කරන්නේ නම්, මේ සඳහාද පරීක්ෂා කරන්න: ("අර්ධ / අජැක්ස්") සමානයි ඉග්නෝර් කේස් (request.getHeader ("මුහුණු-ඉල්ලීම"));
ජේ ස්ලික්

ඔබ සඳහන් නොකිරීම නිසා පරිශීලකයින් ඡන්දය ප්‍රකාශ කිරීමට ඉඩ ඇත: (1) ඔබේ දෝෂ ප්‍රතිචාරය හඳුනා ගැනීමට අවශ්‍ය සේවාදායක පාර්ශව මොඩ්ස්; (2) ඔබේ අභිමතකරණය කළ LoginUrlAuthenticationEntryPoint පෙරහන් දාමයට එක් කිරීම සඳහා වසන්ත වින්‍යාසයට අවශ්‍ය මෝඩයන්.
ජේ ස්ලික්

ඔබේ පිළිතුර r ආර්පාඩ් වෙතින් ලැබුණු පිළිතුරට සමානය. එය මට වැඩ කළා; වසන්ත ආරක්ෂාව භාවිතා කිරීම 3.2.9. stackoverflow.com/a/8426947/4505142
ඩැරන් පාකර්

11

පහත දැක්වෙන දේ මගේ login.php පිටුවට ඇතුළත් කිරීමෙන් මම මෙය විසඳා ගතිමි.

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

10

@ ස්ටෙග් විසින් විස්තර කර ඇති පරිදි ගැටලුව නැවත උපුටා දැක්වීමට මට ඉඩ දෙන්න

මට ඔයාට සමාන ප්‍රශ්නයක් තිබුණා. හැකි ප්‍රතිචාර 2 ක් ඇති අජැක්ස් ඉල්ලීමක් මම ඉටු කරමි: බ්‍රව්සරය නව පිටුවකට හරවා යැවීම සහ වත්මන් පිටුවෙහි පවතින HTML පෝරමයක් නව එකක් සමඟ ප්‍රතිස්ථාපනය කිරීම.

IMHO මෙය සැබෑ අභියෝගයක් වන අතර එය වර්තමාන HTTP ප්‍රමිතීන්ට නිල වශයෙන් ව්‍යාප්ත කළ යුතුය.

නව Http ප්‍රමිතිය නව තත්ව කේතයක් භාවිතා කරනු ඇතැයි මම විශ්වාස කරමි. අර්ථය: දැනට 301/302බ්‍රව්සරයට ගොස් මෙම ඉල්ලීමේ අන්තර්ගතය නව එකක් වෙත ගෙන එන ලෙස පවසයිlocation පවසයි.

විස්තාරිත ප්‍රමිතියේදී, එය පවසන්නේ ප්‍රතිචාරය status: 308(උදාහරණයක් පමණක්) නම්, බ්‍රව්සරය ප්‍රධාන පිටුව යලි යොමු කළ යුතු බවයිlocation සපයා ඇති .

එය පැවසීම; මම දැනටමත් මෙම අනාගත හැසිරීම අනුකරණය කිරීමට නැඹුරු වෙමි , එබැවින් document.redirect අවශ්‍ය වූ විට, සේවාදායකයා මෙසේ ප්‍රතිචාර දක්වයි:

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

JS ට " status: 204" ලැබුණු විට, එය x-status: 308ශීර්ෂයේ පැවැත්ම පරීක්ෂා කරන අතර , ලේඛනයක් කරයි location. ශීර්ෂයේ දක්වා ඇති පිටුවට යොමු කරන්න .

මෙය ඔබට තේරුමක් තිබේද?


7

සමහරුන්ට පහත ප්‍රයෝජනවත් විය හැකිය:

අවසර ලත් ටෝකනයකින් තොරව යවනු ලබන ඕනෑම විවේක ක්‍රියාමාර්ගයක් සඳහා සේවාදායකයින් පිවිසුම් පිටුවට හරවා යැවීමට මට අවශ්‍ය විය. මගේ සියලු විවේක ක්‍රියා අජැක්ස් මත පදනම් වූ බැවින්, අජැක්ස් සාර්ථකත්වයේ ක්‍රියාකාරිත්වය හසුරුවනවා වෙනුවට පිවිසුම් පිටුවට හරවා යැවීමට මට හොඳ ක්‍රමයක් අවශ්‍ය විය.

මම කළ දේ මෙයයි:

ඕනෑම අජැක්ස් ඉල්ලීමකදී මගේ සේවාදායකයා විසින් Json 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 තත්ත්වය යැවීමට සේවාදායකයේ ...

a .ajax ශ්‍රිතය තුළ ඔබ ශ්‍රිතය භාවිතා නොකළ යුතුය .toString()..., නිකම්ම

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

ගැටලුව වන්නේ එය ඉතා නම්‍යශීලී නොවීම, ඔබට හරවා යැවිය යුත්තේ කොතැනටද යන්න තීරණය කළ නොහැක ..

සේවාදායක හරහා නැවත හරවා යැවීම හොඳම ක්‍රමය විය යුතුය. නමුත් මට තවමත් එය කිරීමට නිවැරදි මාර්ගය සොයාගත නොහැක.


5

මට අවශ්‍ය වූයේ මුළු පිටුව සඳහාම ඕනෑම අජැක්ස් ඉල්ලීමක් ඉදිරිපත් කිරීමයි. Up සුපර් ජී මාව ආරම්භ කළා. මෙන්න මම අවසන් කළේ:

// 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;
        }
});

මගේ තීරණය පදනම් කර ගැනීම සඳහා ඇතැම් http තත්ව කේතයන් විශේෂයෙන් පරීක්ෂා කිරීමට මට අවශ්‍ය විය. කෙසේ වෙතත්, ඔබට සාර්ථකත්වය හැර වෙනත් කිසිවක් ලබා ගැනීම සඳහා ඔබට අජැක්ස් දෝෂයට බැඳිය හැකිය (200 ක් පමණක් විය හැකිද?) මට ලිවිය හැකිව තිබුණේ:

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

1
දෙවැන්න දෝශ නිරාකරණය ගැටළු සහගත වන වෙනත් දෝෂ සඟවයි
ටිම් ඇබෙල්

1
403 යන්නෙන් අදහස් කරන්නේ පරිශීලකයා සත්‍යාපනය කර නොමැති බව නොවේ, එයින් අදහස් කරන්නේ (බොහෝ විට සත්‍යාපනය කළ) පරිශීලකයාට ඉල්ලූ සම්පත බැලීමට අවසර නොමැති බවයි. එබැවින් එය පිවිසුම් පිටුවට හරවා යැවිය යුතු නැත
රොබ්

5

ඔබට ද අගයන් සමත් වීමට අවශ්‍ය නම් ඔබට සැසි විචල්‍යයන් සකසා ප්‍රවේශ විය හැකිය උදා: ඔබේ jsp තුළ ඔබට ලිවිය හැකිය

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

එවිට ඔබට මෙම තාවකාලික අගය ඔබේ ජාවාස්ක්‍රිප්ට් විචල්‍යය තුළ ගබඩා කර සෙල්ලම් කළ හැකිය


5

ශීර්ෂ විසඳුම සමඟ මට කිසිදු සාර්ථකත්වයක් නොලැබුණි - ඒවා කිසි විටෙකත් මගේ ajaxSuccess / ajaxComplete ක්‍රමයට තෝරාගෙන නොමැත. අභිරුචි ප්‍රතිචාරය සමඟ මම ස්ටෙග්ගේ පිළිතුර භාවිතා කළෙමි, නමුත් මම ජේඑස් පැත්ත වෙනස් කළෙමි. සෑම කාර්යයකදීම මා කැඳවන ක්‍රමයක් සැකසූ නිසා මට සම්මත $.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 ක් ලැබුණි. එබැවින්, මා කළේ 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 භාවිතා කිරීම "හරි" නොවේ, නමුත් අවම වශයෙන් එය මට අවශ්‍ය ආකාරයටම ක්‍රියාත්මක විය.

PS: SO හි ජංගම අනුවාදය සංස්කරණය කිරීම සඳහා මෙය විශාල වේදනාවක් විය. මෝඩ අයිඑස්පී මගේ පිළිතුර අවලංගු කළ විට මගේ සේවා අවලංගු කිරීමේ ඉල්ලීම නිවැරදිව ඉදිරිපත් කළේය!


4

ඔබට XMLHttpRequest යැවීමේ මූලාකෘතියද සම්බන්ධ කළ හැකිය. මෙය එක් යැවීමක් සමඟ සියලුම යැවීම් (jQuery / dojo / etc) සඳහා ක්‍රියා කරයි.

පිටු 500 ක කල් ඉකුත් වූ දෝෂයක් හැසිරවීමට මම මෙම කේතය ලිවුවෙමි, නමුත් එය යළි-යොමුවීම් 200 ක් උගුලට හසු කර ගැනීමටද ක්‍රියා කළ යුතුය. සූදානම් ස්ටේට් හි තේරුම ගැන XMLHttpRequest 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');
    }
});

UPD: Opps. එකම කාර්යය කරන්න, නමුත් එය ක්රියා නොකරයි. මේ දේවල් කරනවා. මම එය සොයාගත් විට මම ඔබට විසඳුම පෙන්වන්නම්.


4
මෙය ක්‍රියාත්මක නොවන බව කතුවරයා විසින්ම පවසන බැවින් මෙම පිළිතුර මකා දැමිය යුතුය. ඔහුට පසුව වැඩ කරන විසඳුමක් පළ කළ හැකිය. -1
TheCrazyProgrammer

අදහස හොඳයි, නමුත් ගැටළුව වන්නේ "පිහිටීම" ශීර්ෂය කිසි විටෙකත් සම්මත නොවීමයි.
මාටින් ස්වාරක්

මගේ සංස්කරණය ප්‍රතික්ෂේප විය, එබැවින් ... ඔබ "var xmlHttp = $ .ajax ({...." භාවිතා කළ යුතුය. විචල්‍යය ඇතුළත තිබිය නොහැක ... ඉන්පසු භාවිතා කරන්න: console.log (xmlHttp.getAllResponseHeaders ()) ;
මාටින් ස්වාරක්

2

@ ජෝන් සහ r ආර්පාඩ් සබැඳිය සහ ob රොබ් වින්ච් සබැඳියෙන් පිළිතුරු භාවිතා කරමින් මට වැඩ කිරීමේ විසඳුමක් ලැබුණි.

මම වසන්ත ආරක්ෂාව 3.2.9 සහ jQuery 1.10.2 භාවිතා කරමි.

AJAX ඉල්ලීම් වලින් පමණක් 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>

මගේ JSPs හි, මෙහි පෙන්වා ඇති පරිදි ගෝලීය 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");
          }
      }
  });

එසේම, ජේඑස්පී පිටුවල ඇති AJAX ඇමතුම් වලින් පවතින දෝෂ හසුරුවන්නන් ඉවත් කරන්න:

        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");
//            }
        });

එය අන් අයට උපකාර කරනු ඇතැයි මම බලාපොරොත්තු වෙමි.

Update1 මට ආකෘති-පිවිසුම් වින්‍යාසයට විකල්පය ( සැමවිටම- use-default-target = "true") එක් කිරීමට අවශ්‍ය බව මට පෙනී ගියේය. මෙය අවශ්‍ය වූයේ AJAX ඉල්ලීමක් පිවිසුම් පිටුවට හරවා යැවීමෙන් පසුව (කල් ඉකුත් වූ සැසිය නිසා), වසන්තය පෙර AJAX ඉල්ලීම සිහිපත් කරන අතර පිවිසීමෙන් පසු ස්වයංක්‍රීයව එය වෙත හරවා යවයි. මෙය ආපසු ලබා දුන් JSON බ්‍රව්සර් පිටුවේ දර්ශනය වීමට හේතු වේ. ඇත්ත වශයෙන්ම, මට අවශ්‍ය දේ නොවේ.

Update2 භාවිතා කිරීම වෙනුවට always-use-default-target="true", requstCache වෙතින් AJAX ඉල්ලීම් අවහිර කිරීම පිළිබඳ @RobWinch උදාහරණය භාවිතා කරන්න. පුරනය වීමෙන් පසු සාමාන්‍ය සබැඳි ඒවායේ මුල් ඉලක්කය වෙත හරවා යැවීමට මෙය ඉඩ දෙයි, නමුත් AJAX පිවිසීමෙන් පසු මුල් පිටුවට යන්න.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.