2010-05-28 88 views
20

我是ajax的新手,我知道有人会遇到这个问题。 我有一个构建在Spring MVC上的传统应用程序,它有一个拦截器(过滤器),用于在没有会话时将用户重定向到登录页面 页面。在Ajax jquery调用上重定向

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登录的-Markup的页面 - 我查了我的萤火虫,有一个302的价值

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

     }); 
}); 

HTTP响应,但我在这里我不知道如何捕捉到的响应和用户重定向到登录 页面。任何想法?谢谢。

回答

47

jQuery是寻找一个JSON类型的结果,但由于重定向自动处理,它会收到生成了您的login.htm页面的html源代码

一个想法是让浏览器知道它应该通过增加一个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... 
      } 
     } 
//.... 

希望有所帮助。

我的回答很大程度上受this thread的启发,如果您仍有问题,请不要留下任何问题。

+0

嗨moonground ..谢谢,我想我已经得到你的观点已经给出这个例子...非常感谢你... – 2010-05-31 01:18:45

+0

谢谢托马斯。我有点得到它,但我会读更多的参考线程,所以它可以沉入一点。尽管如此,它似乎是我正在寻找的答案,所以非常感谢! – Mark 2012-11-01 16:47:23

+1

如何将重定向变量添加到响应中? – nikli 2015-06-08 06:31:04