Как управлять запросом на перенаправление после вызова jQuery Ajax

Если вы используете «мальчик» в качестве разделителя, вы получите оставшиеся части. Вы можете использовать их в качестве клавиш выбора.

>>> re.split("boy","I am a good buy and bad boy too")
['I am a good buy and bad ', ' too']
1286
задан John Slegers 22 January 2016 в 20:21
поделиться

10 ответов

Решение, которое было в конечном счете реализовано, состояло в том, чтобы использовать обертку для функции обратного вызова вызова Ajax и в этой проверке обертки на существование определенного элемента на возвращенном блоке HTML. Если элемент был найден затем, обертка выполнила перенаправление. В противном случае обертка перевела вызов к фактической функции обратного вызова.

, Например, наша функция обертки была чем-то как:

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

Затем при совершении вызова Ajax мы использовали что-то как:

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

Это работало на нас, потому что все вызовы Ajax всегда возвращали HTML в элементе DIV, который мы используем для замены части страницы. Кроме того, мы только должны были перенаправить к странице входа в систему.

90
ответ дан radbyx 23 January 2016 в 06:21
поделиться

Дополнительно Вы, вероятно, захотите перенаправить пользователя к данному в URL заголовков. Таким образом, наконец это будет быть похожим на это:

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

UPD: Opps. Имейте ту же задачу, но это не работы. Выполнение этого материала. Я покажу Вам решение, когда я найду его.

2
ответ дан Vladimir Prudnikov 22 January 2016 в 20:21
поделиться

Используйте низкоуровневый $.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';
}
46
ответ дан Till 22 January 2016 в 20:21
поделиться

Никакие браузеры не обрабатывают 301 и 302 ответа правильно. И на самом деле в стандарте даже говорится, что они должны обработать их "прозрачно", который является ОБШИРНОЙ головной болью для поставщиков Библиотеки Ajax. В Ajax Ра мы были принуждены к использованию Кода состояния ответа HTTP 278 (просто некоторый "неиспользованный" код успеха) для обработки прозрачно перенаправлений с сервера...

Это действительно раздражает меня, и если бы у кого-то здесь есть некоторое "получение по запросу" в W3C, я ценил бы, что Вы могли позволить W3C знать , что мы действительно должны обработать 301 и 302 кода сами...!;)

110
ответ дан Gone Coding 22 January 2016 в 20:21
поделиться

в сервлете необходимо поместить response.setStatus(response.SC_MOVED_PERMANENTLY); для отправки '301' xmlHttp состояние, в котором Вы нуждаетесь для перенаправления...

и в $ .ajax функционируют, Вы не должны использовать эти .toString() функция..., всего

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

, проблема - он, не очень гибко, Вы не можете решить, где Вы хотите перенаправить..

перенаправление через сервлеты должно быть лучшим способом. но я все еще не могу найти правильный способ сделать это.

5
ответ дан 22 January 2016 в 20:21
поделиться

Я решил этот выпуск:

  1. Добавление пользовательского заголовка к ответу:

    public ActionResult Index(){
        if (!HttpContext.User.Identity.IsAuthenticated)
        {
            HttpContext.Response.AddHeader("REQUIRES_AUTH","1");
        }
        return View();
    }
    
  2. Привязка JavaScript функционирует к ajaxSuccess событие и проверка, чтобы видеть, существует ли заголовок:

    $(document).ajaxSuccess(function(event, request, settings) {
        if (request.getResponseHeader('REQUIRES_AUTH') === '1') {
           window.location = '/';
        }
    });
    
228
ответ дан 5 revs, 4 users 77%SuperG 23 January 2016 в 06:21
поделиться

Собираем воедино слова Владимира Прудникова и Томаса Хансена:

  • Измените код на стороне сервера, чтобы определить, является ли это XHR. Если это так, установите код ответа перенаправления на 278. В django:
  если request.is_ajax ():
 response.status_code = 278

Это заставляет браузер рассматривать ответ как успешный и передавать его в ваш Javascript.

  • Убедитесь, что в вашем JS форма отправляется через Ajax, проверьте код ответа и при необходимости перенаправьте:
 $ ('# my-form'). submit (function (event) { 

 event.preventDefault (); 
 var options = {
 url: $ (this) .attr ('действие'),
 введите: 'POST',
 complete: function (response, textStatus) { 
 if (response.status == 278) { 
 window.location = response.getResponseHeader ('Местоположение')
 }
 else {... здесь ваш код ...} 
 },
 данные: $ (это) .serialize (), 
 }; 
 $ .ajax (параметры); 
});
16
ответ дан 19 December 2019 в 20:15
поделиться

Я прочитал этот вопрос и реализовал подход, который был заявлен относительно установки кода состояния ответа HTTP на 278, чтобы избежать прозрачной обработки перенаправления браузером. Несмотря на то, что это сработало, я был немного недоволен, так как это немного похоже на хакерство.

После дополнительных поисков я отказался от этого подхода и использовал JSON . В этом случае все ответы на запросы AJAX имеют код состояния 200, а тело ответа содержит объект JSON, созданный на сервере. Затем JavaScript на клиенте может использовать объект JSON, чтобы решить, что ему нужно делать.

У меня была проблема, аналогичная вашей. Я выполняю запрос 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» создается на сервере и имеет 2 члена: data.redirect и data.form . Я обнаружил, что этот подход намного лучше.

683
ответ дан 19 December 2019 в 20:15
поделиться

Я просто хотел зафиксировать любые запросы ajax для всей страницы. @SuperG заставил меня начать. Вот что у меня получилось:

// 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, чтобы основывать свое решение. Однако вы можете просто привязать к ajaxError, чтобы получить что-нибудь, кроме успеха (возможно, 200?) Я мог бы просто написать:

$('body').bind('ajaxError', function(event,request,settings){
    window.location.replace("http://mysite.tld/login");
}
5
ответ дан 19 December 2019 в 20:15
поделиться

У меня есть простое решение это работает для меня, не требуется изменение кода сервера ... просто добавьте чайную ложку мускатного ореха ...

$(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, но вы можете изменить indexOf для поиска любой уникальной строки, существующей на вашей странице входа ...

17
ответ дан 19 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: