Перенаправление на Ajax Jquery Call - PullRequest
22 голосов
/ 28 мая 2010

Я новичок в ajax и знаю, что кто-то уже сталкивался с этой проблемой. У меня есть старое приложение, построенное на Spring MVC, оно имеет перехватчик (фильтр), который перенаправляет пользователя на вход страницу, когда нет сеанса.

public class SessionCheckerInterceptor extends HandlerInterceptorAdapter {
 public boolean preHandle(HttpServletRequest request,
   HttpServletResponse response, Object handler) throws Exception {
  HttpSession session = request.getSession();

  // check if userInfo exist in session
  User user = (User) session.getAttribute("user");
  if (user == null) {
   response.sendRedirect("login.htm");
   return false;
  }
  return true;
 }
}

Для запросов не xmlhttp это работает нормально ... но когда я пытаюсь использовать ajax в моем приложении, все становится странным, он не может правильно перенаправить на страницу входа. Как проверить значение

xhr.status = 200 textStatus = parseError errorThrown = "Недопустимый JSON -Маркет моей страницы входа в HTML-

$(document).ready(function(){
        jQuery.ajax({
            type: "GET",
            url: "populateData.htm",
            dataType:"json",
            data:"userId=SampleUser",
            success:function(response){
             //code here
            },
         error: function(xhr, textStatus, errorThrown) {
                alert('Error!  Status = ' + xhr.status);
             }

        });
});

Я проверил на своем firebug, что есть HTTP-ответ 302, но я не уверен, как перехватить ответ и перенаправить пользователя к логину стр. Есть идеи? Спасибо.

1 Ответ

49 голосов
/ 28 мая 2010

JQuery ищет результат типа json , но поскольку перенаправление обрабатывается автоматически, он получит сгенерированный источник HTML вашей страницы login.htm.

Одна идея - дать браузеру понять, что он должен перенаправить, добавив переменную redirect к результирующему объекту и проверив ее в JQuery:

$(document).ready(function(){ 
    jQuery.ajax({ 
        type: "GET", 
        url: "populateData.htm", 
        dataType:"json", 
        data:"userId=SampleUser", 
        success:function(response){ 
            if (response.redirect) {
                window.location.href = response.redirect;
            }
            else {
                // Process the expected results...
            }
        }, 
     error: function(xhr, textStatus, errorThrown) { 
            alert('Error!  Status = ' + xhr.status); 
         } 

    }); 
}); 

Вы также можете добавить переменную заголовка в свой ответ и позволить своему браузеру решить, куда перенаправить. В Java вместо перенаправления выполните response.setHeader("REQUIRES_AUTH", "1"), а в JQuery - на успех (!):

//....
        success:function(response){ 
            if (response.getResponseHeader('REQUIRES_AUTH') === '1'){ 
                window.location.href = 'login.htm'; 
            }
            else {
                // Process the expected results...
            }
        }
//....

Надеюсь, это поможет.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...