Kaip valdyti peradresavimo užklausą paskambinus jQuery Ajax

Aš naudoju $.post() kad paskambintumėte servletą, naudodami „Ajax“, ir naudokite gautą HTML fragmentą, kad pakeistumėte dabartinį naudotojo puslapio div elementą. Tačiau, jei sesija baigiasi, serveris siunčia peradresavimo direktyvą, kad naudotojas išsiųstų į prisijungimo puslapį. Tokiu atveju jQuery pakeičia div elementą su prisijungimo puslapio turiniu, verčia vartotojo akis matyti retą sceną.

Kaip valdyti peradresavimo direktyvą iš „Ajax“ skambučio naudojant jQuery 1.2.6?

1175
14 окт. „ Elliot Vargas“ nustatė spalio 14 d 2008-10-14 00:29 '08 at 0:29 2008-10-14 00:29
ответ 31 atsakymų
  • 1
  • 2

Galiausiai įgyvendintas sprendimas buvo panaudoti „Ajax“ atgalinio ryšio funkcijos pakuotę ir šiame patikrinime, ar grįžtamasis HTML blokas turi tam tikrą elementą. Jei rastas elementas, korpusas nukreipiamas. Priešingu atveju pakuotė nukreipė skambutį į faktinę atgalinio ryšio funkciją.

Pavyzdžiui, mūsų vyniojimo funkcija buvo tokia:

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

Tada, kurdami „Ajax“ skambutį, naudojome kažką panašaus:

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

Jis dirbo mums, nes visi „Ajax“ skambučiai visuomet grįžta į DIV elementą, kurį mes naudojame, kad pakeistume puslapio dalis. Be to, turėjome nukreipti į prisijungimo puslapį.

85
27 янв. Elliot Vargas atsakė į 27 Jan 2009-01-27 21:10 '09 9:10 val. 2009-01-27 21:10

Aš perskaičiau šį klausimą ir įgyvendinau požiūrį, kuris buvo suformuluotas reagavimo būsenos kodo nustatymui iki 278, kad būtų išvengta naršyklės skaidrumo peradresuojant. Nepaisant to, kad jis dirbo, buvau šiek tiek nepatenkintas, nes jis buvo šiek tiek nulaužtas.

Po to, kai pradėjau kasti, šį metodą išmetiau ir naudoju JSON . Tokiu atveju, visi atsakymai į „ajax“ užklausas turi statuso kodą 200, o atsakymo įstaiga turi JSON objektą, kuris yra sukurtas serveryje. Tada kliento javascript gali naudoti JSON objektą, kad nuspręstų, ką reikia daryti.

Turėjau panašią problemą su tavimi. Aš paleisiu „Ajax“ užklausą, turinčią du galimus atsakymus: vieną, kuris nukreipia naršyklę į naują puslapį ir pakeičia esamą HTML formą dabartiniame puslapyje nauju. Šio „jquery“ kodas atrodo taip:

border=0
 $.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 objekto duomenys yra sukurti ant serverio, kad būtų 2 nariai: data.redirect ir data.form. Radau šį požiūrį daug geriau.

630
08 окт. atsakymas pateiktas Steg 08 okt. 2009-10-08 01:54 '09 ne 1:54 2009-10-08 01:54

Aš išsprendžiau šią problemą:

  • Pridėjus pasirinktą antraštę atsakymui:

     public ActionResult Index(){ if (!HttpContext.User.Identity.IsAuthenticated) { HttpContext.Response.AddHeader("REQUIRES_AUTH","1"); } return View(); } 
  • ajaxSuccess JavaScript“ funkciją su „ ajaxSuccess įvykiu ir patikrinkite, ar egzistuoja esama antraštė:

     $(document).ajaxSuccess(function(event, request, settings) { if (request.getResponseHeader('REQUIRES_AUTH') === '1') { window.location = '/'; } }); 
209
24 февр. atsakymas pateikiamas SuperG vasario 24 d 2009-02-24 02:49 '09 at 2:49 am 2009-02-24 02:49

Nė viena naršyklė tinkamai nevykdo 301 ir 302 atsakymų. Ir iš tikrųjų, standartas netgi sako, kad jie turi juos tvarkyti „skaidriai“, o tai yra MASSIVE galvos skausmas Ajax bibliotekų pardavėjams. „ Ra-Ajax“ turėjome naudoti HTTP 278 atsakymo būsenos kodą (tik tam tikrą „nepanaudotą“ sėkmės kodą), siekiant skaidriai nukreipti iš serverio ...

Tai tikrai erzina mane, ir jei kas nors turi „traukti“ W3C čia, aš džiaugiuosi, kad galėtumėte leisti W3C žinoti, kad mums tikrai reikia tvarkyti 301 ir 302 kodus ...!

106
20 нояб. Thomas Hansen atsakymas lapkričio 20 d 2008-11-20 11:39 '08 at 11:39 2008-11-20 11:39

Man patinka Timmerio metodas su nedideliu citrina. Jei kada nors grįšite turinio tipątext / html , kai tikitės JSON , greičiausiai bus nukreiptas. Mano atveju paprasčiausiai perkeliu puslapį ir nukreipiu į prisijungimo puslapį. Oi, ir patikrinkite, ar valstybės jqXHR yra 200, o tai atrodo kvaila, nes esate klaidos funkcija, tiesa? Priešingu atveju toleruotinos klaidos bus perkraunamos (oops)

 $.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(); } }); 
56
23 авг. atsakymas pateikiamas BrianY 23 rug . 2011-08-23 22:21 '11, 10:21 val. 2011-08-23 22:21

Naudokite mažo lygio $.ajax() skambutį:

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

Pabandykite peradresuoti:

 if (xmlHttp.code != 200) { top.location.href = '/some/other/page'; } 
44
14 окт. atsakymas pateiktas iki 14 val. 2008-10-14 00:54 '08 at 0:54 2008-10-14 00:54

Aš tik norėjau pasidalinti savo požiūriu, nes tai galėjo padėti:

Aš daugiausia įtraukiau „JavaScript“ modulį, kuris tvarko autentifikavimo elementus, pvz., Naudotojo vardą ir šį atvejį, kuris tvarko peradresavimą į prisijungimo puslapį .

Mano scenarijus: mes iš esmės turime ISA serverį, iš kurio klausomi visi prašymai, ir 302 bei mūsų prisijungimo puslapio antraštės antraštė .

Mano „JavaScript“ modulyje mano pradinis požiūris buvo kažkas panašaus

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

Problema (kaip minėta pirmiau) yra ta, kad naršyklė pati valdo peradresavimą, taigi mano atgalinis „ ajaxComplete niekada nebuvo iškviestas, bet aš gavau atsakymą į jau nukreiptą prisijungimo puslapį, kuris akivaizdžiai buvo status 200 . Problema: kaip nustatyti, ar sėkmingas atsakymas 200 yra jūsų tikrasis prisijungimo puslapis arba tik kitas savavališkas puslapis?

Sprendimas

Kadangi aš negalėjau užfiksuoti 302 peradresavimo atsakymų, savo prisijungimo puslapyje pridėjau „ LoginPage antraštę, kurioje buvo pats prisijungimo puslapio URL. Modulyje dabar klausau antraštės ir peradresavimo:

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

... ir tai veikia kaip žavesys :). Jums gali būti įdomu, kodėl LoginPage URL į „ LoginPage antraštę ... gerai, daugiausia dėl to, kad neradau būdų, kaip nustatyti GET URL, nes automatinis vietos nukreipimas iš xhr objekto ...

31
23 мая '12 в 13:02 2012-05-23 13:02 atsakymą pateikė Juri gegužės 23 d., 12 val. 12.00 val. 2012-05-23 13:02

Žinau, kad ši tema yra sena, bet aš pateiksiu kitą požiūrį, kurį rado ir anksčiau aprašiau. Aš daugiausia naudoju ASP.MVC su WIF (bet tai nėra labai svarbu šios temos kontekste - atsakymas yra tinkamas, nepaisant to, kokia sistema yra naudojama. Indikacija išlieka tokia pati - sprendžiant problemas, susijusias su autentifikavimo klaidomis vykdant „ajax“ užklausas).

Toliau pateiktas metodas gali būti taikomas visoms prašom atminties užklausoms iš dėžutės (nebent jos aiškiai nepaiso sendSend įvykio).

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

Prieš CheckPulse ajax“ užklausą CheckPulse metodas (valdiklio metodas gali būti bet koks paprastas):

 [Authorize] public virtual void CheckPulse() {} 

Jei vartotojas nėra atpažintas (ženklas baigėsi), šis metodas negali būti pasiekiamas (apsaugotas atributo „ Authorize ). Kadangi struktūra apdoroja autentifikavimą, o simbolis baigiasi, jis atsiunčia HTTP būseną 302. Jei nenorite, kad jūsų naršyklė tvarkytų 302 atsakymus skaidriai, sugaukite jį „Global.asax“ ir pakeiskite atsakymo būseną - pavyzdžiui, iki 200 OK. Be to, pridėkite antraštę, nurodančią jus apdoroti tokį atsakymą ypatingu būdu (vėliau kliento pusėje):

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

Galiausiai, kliento pusėje patikrinkite tokį pasirinktinį antraštę. Jei yra, visiškas nukreipimas į prisijungimo puslapį (mano atveju, window.location pakeičiamas užklausos URL, kuris automatiškai apdorojamas mano sistemoje).

 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; } } }); } 
26
07 мая '13 в 2:55 2013-05-07 02:55 Atsakymą pateikė jwaliszko gegužės 07 d. 13 val. 2:55 2013-05-07 02:55

Manau, kad tai yra geriausias būdas naudoti esamus HTTP protokolo atsako kodus, ypač 401 Unauthorized .

Štai kaip aš nusprendžiau:

  • Serverio pusė: jei sesija baigiasi, ir užklausa - ajax. siųsti atsakymo kodo antraštę 401
  • Kliento pusė: privalomas laikx įvykių

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

TJO yra bendresnė ir nesate rašęs jokio naujo vartotojo specifikacijos / antraštės. Taip pat nereikia keisti esamų „ajax“ skambučių.

Redaguoti: Toliau pateiktame @Rob komentare 401 (HTTP būsenos kodas autentifikavimo klaidoms) turėtų būti rodiklis. Daugiau informacijos žr. 403 „Uždrausta vs 401 neleistini HTTP atsakymai“ . Tačiau kai kuriose interneto sistemose autentifikavimo ir autorizacijos klaidoms naudojama 403, todėl jas atitinkamai pritaikykite. Ačiū, Rob.

21
23 окт. atsakymas, pateiktas rynop 23 okt. 2012-10-23 19:27 '12, 07:27 pm 2012-10-23 19:27

Šią problemą išsprendžiau taip:

Jei norite tvarkyti atsakymą, pridėkite tarpinę programinę įrangą, jei tai yra peradresavimas „ajax“ užklausai, pakeiskite atsakymą į įprastą atsaką su peradresavimo 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 

Tada „ajaxComplete“, jei atsakyme yra nukreipimas, jis turėtų būti nukreiptas, todėl pakeiskite naršyklės vietą.

 $('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; } } } 
17
06 янв. Atsakymą pateikė Tyr 06 06 2012-01-06 04:33 '12 at 4:33 2012-01-06 04:33

Kitas rastas sprendimas (ypač naudingas, jei norite nustatyti pasaulinį elgesį) yra metodas „ $.ajaxsetup() kartu su statusCode . Kaip kiti nurodė, nenaudokite peradresavimo būsenos kodo ( 3xx ), vietoj to naudokite būsenos kodą 4xx ir apdorokite peradresavimo kliento dalį.

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

Pakeiskite 400 su būsenos kodu, kurį norite apdoroti. Kaip jau minėta, 401 Unauthorized gali būti gera idėja. Aš naudoju 400 nes jis yra labai nespecifinis, ir galiu naudoti 401 konkretiems atvejams (pvz., Neteisingi įgaliojimai). Todėl, vietoj tiesioginio nukreipimo, „backend“ turėtų grąžinti 4xx klaidos kodą, kai sesija laukia, ir apdorojate peradresavimo kliento dalį. Jis puikiai tinka man net ir su tokiomis sistemomis kaip backbone.js

17
02 мая '14 в 0:42 2014-05-02 00:42 atsakymas pateikiamas morten.c 02 Gegužės 14 d. 0:42 2014-05-02 00:42

Ši problema gali kilti naudojant ASP.NET MVC RedirectToAction metodą. Jei norite, kad forma nebūtų rodoma „div“, galite tiesiog padaryti tam tikrą „ajax“ atsako filtrą, kad įtrauktumėte $ atsakymus . AjaxSetup . Jei atsakyme yra MVC peradresavimas, šią vertę galite įvertinti JS pusėje. Toliau pateikiamas JS pavyzdys:

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

Jei duomenys: "window.location = '/ Acount / Login" virš filtro, jis bus sugautas ir įvertinamas peradresuoti, o ne leisti išvestį.

17
27 окт. spalio 27 d. atsakymą pateikė Przemek Marcinkiewicz 2016-10-27 16:31 '16 at 16:31 pm 2016-10-27 16:31

Dauguma pirmiau minėtų sprendimų naudoja problemą, naudodami papildomą antraštę arba netinkamą HTTP kodą. Šie sprendimai greičiausiai veiks, bet šiek tiek „nulaužti“. Aš atėjau kitą sprendimą.

Mes naudojame WIF, kuris yra sukonfigūruotas nukreipti (passiveRedirectEnabled = "true") į 401 atsakymą. Peradresavimas yra naudingas tvarkant reguliarius prašymus, bet neveiks AJAX užklausoms (kadangi naršyklės neatliks 302 / peradresavimo).

Naudodami šį kodą savo global.asax sistemoje, galite išjungti peradresavimą, kai prašoma 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; } } 

Tai leidžia jums grąžinti 401 atsakymą į „AJAX“ užklausas, kad „JavaScript“ galėtų apdoroti, perkeliant puslapį. Puslapio perkrovimas bus 401, kurį apdoros WIF (ir WIF nukreips vartotoją į prisijungimo puslapį).

Pavyzdys javascript, skirtas 401 klaidai tvarkyti:

 $(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); } }); 
16
14 февр. Atsakymą pateikė Robas vasario 14 d. 2014-02-14 16:56 '14 at 16:56 2014-02-14 16:56

Sujungus Vladimirą Prudnikovą ir Thomasą Hanseną:

  • Pakeiskite serverio kodą, kad nustatytumėte, ar tai yra XHR. Jei taip, nustatykite nukreipimo atsakymo kodą numeriu 278. „jango“:
  if request.is_ajax(): response.status_code = 278 

Dėl to naršyklė suvokia atsakymą kaip sėkmingą ir perduoda ją „JavaScript“.

  • JS įsitikinkite, kad forma yra pateikta per „Ajax“, patikrinkite atsakymo kodą ir, jei reikia, peradresuokite:
 $('#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); }); 
15
06 авг. atsakymą pateikė Graham King 06 rug. 2009-08-06 23:17 '09 23:17 2009-08-06 23:17

Turiu paprastą sprendimą, kuris veikia man, nereikia pakeisti serverio kodo ... tiesiog pridėkite muskato riešutų tsp ...

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

Patikrinu html žymos buvimą, bet galite pakeisti indeksąOf, kad galėtumėte ieškoti bet kokios unikalios eilutės prisijungimo puslapyje ...

14
17 авг. Timmerz atsakymas 17 rug . 2010-08-17 21:07 '10, 21:07, 2010-08-17 21:07

Pabandykite

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

Įdėkite jį į prisijungimo puslapį. Jei jis buvo įkeltas į „div“ pagrindiniame puslapyje, jis bus nukreiptas į prisijungimo puslapį. „#site“ yra div identifikatorius, kuris yra visuose puslapiuose, išskyrus prisijungimo puslapį.

11
05 окт. atsakymas pateikiamas podeig 05 oct. 2010-10-05 09:53 '10, 9:53, 2010-10-05 09:53
  <script> function showValues() { var str = $("form").serialize(); $.post('loginUser.html', str, function(responseText, responseStatus, responseXML){ if(responseStatus=="success"){ window.location= "adminIndex.html"; } }); } </script> 
11
10 сент. atsakymas pateikiamas Priyanka 10 sep. 2011-09-10 19:44 '11, 19:44, 2011-09-10 19:44

Aš išsprendžiau šią problemą į savo login.php puslapį.

 <script type="text/javascript"> if (top.location.href.indexOf('login.php') == -1) { top.location.href = '/login.php'; } </script> 
10
05 дек. Paul Richards atsakymas gruodžio 05 d 2011-12-05 22:59 '11, 10:59 val. 2011-12-05 22:59

Nors atsakymai, atrodo, veikia žmonėms, jei naudojate „Spring Security“, aš pastebėjau „LoginUrlAuthenticationEntryPoint“ plėtinį ir pridėjau kodą, kad geriau valdytumėte AJAX. Dauguma pavyzdžių perima visus peradresavimus, o ne tik autentifikavimo gedimus. Tai buvo nepageidaujama projektui, kuriuo dirbau. Taip pat gali prireikti išplėsti „ExceptionTranslationFilter“ ir panaikinti sendStartAuthentication metodą, kad pašalintumėte spartinimo veiksmą, jei nenorite, kad nepavyko išsaugoti AJAX užklausą.

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

Šaltiniai: 1 , 2

9
17 сент. Atsakymą pateikė John 17 Sep 2013-09-17 19:07 '13, 07:07 pm 2013-09-17 19:07

Kai kurie iš jų gali būti naudingi:

Norėjau, kad klientai būtų nukreipti į prisijungimo puslapį bet kokiam poilsio veiksmui, kuris siunčiamas be autorizacijos ženklo. Kadangi visa mano poilsio veikla yra pagrįsta „Ajax“, turiu gerą bendrą būdą nukreipti į prisijungimo puslapį, o ne apdoroti „Ajax“ sėkmės funkciją.

Tai aš padariau:

Bet kuriame „Ajax“ prašyme serveris grąžins „Json 200“ atsakymą „PATVIRTINTI NEEDED“ (jei klientui reikia autentifikuoti).

Paprastas pavyzdys „Java“ (serverio pusėje):

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

Mano „JavaScript“ versijoje pridėjau šį kodą:

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

O kaip apie tai.

7
09 апр. Atsakymas pateikiamas Tomer 09 balandžio. 2016-04-09 02:26 '16 at 14:26 pm 2016-04-09 02:26

Aš tik norėjau įsitraukti į visus „Ajax“ prašymus dėl viso puslapio. @SuperG privertė mane pradėti. Štai ką baigiau:

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

Aš norėjau konkrečiai patikrinti tam tikrus http būsenos kodus, kad galėčiau pagrįsti savo sprendimą. Tačiau ar galite tiesiog susieti ajaxError į kažką kitą, o ne sėkmę (galbūt tik 200)? Galėčiau tiesiog parašyti:

 $('body').bind('ajaxError', function(event,request,settings){ window.location.replace("http://mysite.tld/login"); } 
5
04 авг. atsakymą pateikė Bretticus 04 rug . 2010-08-04 21:47 '10, 21:47, 2010-08-04 21:47

Galiausiai, išsprendžiu problemą pridedant priskirtą HTTP Header . Prieš atsakant į kiekvieną serverio užklausą, atsakymo antraštėje pridedu dabartinį prašomą URL.

Mano tipo programa yra Asp.Net MVC serveryje, ir tai yra gera vieta. „ Global.asax sistemoje Global.asaxApplication_EndRequest įvykį, todėl:

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

Tai puikiai tinka man! Dabar kiekviename „ JQuery $.post atsakyme turiu reikalaujamą url , taip pat kitus atsakymo antraštes, kurios yra POST metodo rezultatas būsenoje 302 , 303 , ....

ir kitas svarbus, kad nereikia keisti kodo serverio pusėje ar kliento pusėje.