重定向 Ajax Jquery 调用

Posted

技术标签:

【中文标题】重定向 Ajax Jquery 调用【英文标题】:Redirect on Ajax Jquery Call 【发布时间】:2011-02-25 00:05:32 【问题描述】:

我是这里的 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);
             

        );
);

我检查了我的萤火虫有一个 302 HTTP 响应,但我不确定如何捕获响应并将用户重定向到登录 页。这里有什么想法吗?谢谢。

【问题讨论】:

这能回答你的问题吗? How to manage a redirect request after a jQuery Ajax call 【参考方案1】:

JQuery 正在寻找一个 json 类型的结果,但由于重定向是自动处理的,它会收到您的login.htm 页面的生成的 html 源。 p>

一个想法是让浏览器知道它应该通过将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 的启发,如果您仍有问题,请不要留下任何问题。

【讨论】:

嗨,moonground..谢谢,我想我已经明白了你的意思了这个例子......非常感谢...... 谢谢托马斯。我有点明白了,但我要多读一些你引用的线程,这样它就可以稍微下沉。尽管如此,这似乎是我正在寻找的答案,所以感谢一百万! 如何将重定向变量添加到响应中?【参考方案2】:

对于 ExpressJs 路由器:

router.post('/login', async(req, res) => 
    return res.send(redirect: '/yoururl');
)

客户端:

    success: function (response) 
        if (response.redirect) 
            window.location = response.redirect
        
    ,

【讨论】:

以上是关于重定向 Ajax Jquery 调用的主要内容,如果未能解决你的问题,请参考以下文章

本机 ajax 调用不会在 302 上重定向

在 jquery Ajax 调用期间页面重定向到上一页

JQuery Ajax 在不设置 cookie 的情况下自动重定向?

烧瓶如何在ajax调用后重定向到新页面[重复]

jQuery ajax 帖子不会重定向到 php 页面

从 jquery ajax statuscode 401 获取位置重定向 url