`

当Ajax请求遇到 redirect 跳转

阅读更多

博客地址:http://blog.ifootsteps.com/?p=64

 

在使用ajax请求服务器时,某些情况需要经过身份验证,如果某个用户停留在页面很长时间,导致令牌过期,此时如果访问某些资源,会验证不通过,但页面却不会跳转到登录页面.
这个情况在网上搜索一下发现遇到的人还不少.下面发现几个很好的解释.
The unfortunate truth about AJAX and the 302 redirect is that you can’t get the headers from the return

because the browser never gives them to the XHR. When a browser sees a 302 it automatically applies the redirect. In this case, you would see the header in firebug because the browser got it, but you would not see it in ajax, because the browser did not pass it. This is why the success and the error handlers never get called. Only the complete handler is called.

With the way XHR is built in general (and in Chrome specifically): XHR is not very flexible, and provides a relatively high-level API, with the same behavior the browser has in all other requests (address bar urls, image source urls, embedded script urls), i.e. redirects are handled transparently. No events will be thrown in the JavaScript alerting you of this redirect or the intermediate 302/301 status codes, you will only receive the final status code and data. Therefore, it is impossible to retrieve the “Location” header from the response, as the final response will not contain the “Location” header.

单词都很简单易懂.另share一下 原文地址:

AJAX redirect dilemma, how to get redirect URL OR how to set properties for redirect request
jQuery and AJAX response header

 

所以无奈下搞出一个方法.

在我们的业务场景下,在服务器端接收到请求后,可以区分是否为ajax请求,所以在区别出是否为ajax请求后,设置如下代码:

//如果是页面请求直接设置为转发,否则为ajax请求设置返回头信息
        if(per.value()==PermissionPolicy.PAGE){
            response.sendRedirect(redirectURL);
        }else{
            response.setIntHeader("REQUIRES_AUTH",1);
            response.setHeader("REQUIRES_AUTH_URL",redirectURL);
        }
        return null;

 在页面因为ajax请求本身就是我们自己封装好的所以只需要加上error时候处理就ok了

$.ajax({
    url : url,
    beforeSend : function(request) {
        request.setRequestHeader("uri", window.location.href);
    },
    type : 'get',
    data : query,
    dataType : 'json',
    error : function( req, status, err) {
        var auth = req.getResponseHeader("REQUIRES_AUTH");
        var auth_url = req.getResponseHeader("REQUIRES_AUTH_URL");
        if(auth == 1 && auth_url){
            window.location.href = auth_url;
        }
        callback([
            {
                datas: '',
                count: 0
            }
        ]);
    },
    success : function(result, textStatus, request) {
        callback(result);
    }
});

 

 

最后分享一句讨厌的话..

Sorry — I hate the “you can’t do this” answers, too, but there are some JavaScript limitations that haven’t quite been ironed out yet.

 

如果其他有解决办法求分享..

分享到:
评论

相关推荐

    ThinkPHP的success并不跳转页面,而是直接输出json字符串的原因.zip解决ThinkPHP的success并不跳转页面,而是直接输出json字符

    在ThinkPHP中,如果你希望在非AJAX请求下使用`success`方法进行页面跳转,你需要确保请求不是通过异步方式发送的。对于前端来说,这意味着需要取消或修改设置`ajax=1`的参数,或者不设置`X-Requested-With`请求头。...

    Ajax请求时无法重定向的问题解决代码详解

    根据给定的文件信息,我们可以详细地了解Ajax请求时遇到的重定向问题以及解决这一问题的代码实现。首先,我们需要明确Ajax请求的特点,以及为何它无法直接处理服务器的重定向响应。接下来,将详细介绍后端代码和前端...

    springboot无法跳转页面的问题解决方案

    ajax 请求是一种异步请求方式,而跳转页面是一种同步请求方式。在本文中,我们将讨论如何解决ajax 请求无法跳转页面的问题。 跳转页面的问题是一个常见的问题。在本文中,我们讨论了跳转页面的问题解决方案,包括...

    C#中的页面跳转

    在实现省市联动时,页面跳转往往不是主要手段,更多的是通过AJAX异步请求来更新页面部分区域,从而提供更流畅的用户体验。省市联动通常指的是当用户选择一个省份后,城市列表会根据所选省份动态更新。这种功能可以...

    完美解决ajax访问遇到Session失效的问题

    然而,当涉及到用户会话(Session)管理时,Ajax请求可能会遇到一些挑战,尤其是当Session失效时。本文将详细介绍如何解决Ajax访问时遇到Session失效的问题。 首先,理解Session失效的背景。Session是服务器端用于...

    页面跳转和数据传递

    6. **POST请求**:通过表单提交或Ajax请求,将数据以请求体的形式发送到服务器,然后服务器根据需要进行跳转。POST请求的数据量大,适合传输大量数据,且数据不显示在URL中。 7. **WebSocket**:建立持久连接,双向...

    Struts 2及AJAX框架的详细介绍

    Struts 2提供了多种与AJAX集成的方式,如使用Struts2的AJAX插件,或者直接利用jQuery等库来实现AJAX请求。 在"从Struts应用开发框架转移到Struts 2 WEB框架 教程.doc"中,可能详细讲解了以下几个方面: 1. **...

    j2ee练习8实现页面自动跳转

    在这个练习中,Servlet可能作为Controller,处理请求并决定跳转到哪个View。 4. **购物界面的逻辑** - 购物界面可能包括商品浏览、添加到购物车、结算等功能。跳转可能涉及到用户操作后的反馈,例如,点击“加入...

    ASP.NET(c#)网页跳转七种方法小结

    本文将详细介绍七种实现网页跳转的方法,包括`Response.Redirect`、`Server.Execute`、`Server.Transfer`以及其他四种方法。通过对比它们的特点、适用场景以及示例代码,帮助开发者更好地理解和应用这些技术。 ####...

    子窗口iframe跳转到父窗口

    前端可以通过AJAX异步请求获取这个重定向指令,并根据返回结果执行相应的跳转动作。 ```javascript $.ajax({ url: '处理请求的URL', success: function(data) { if (data.startsWith("redirect:")) { window....

    页面跳转.zip

    - 在异步请求(如AJAX)中,通常不直接进行页面跳转,而是通过更新DOM元素或使用`window.location`来局部刷新内容。但在某些情况下,可以使用`XMLHttpRequest`的`onreadystatechange`或`onload`事件来实现跳转。 7...

    Rails3-使用ajax处理并发

    通过在链接或表单元素上添加特定的数据属性(如`data-remote="true"`),Rails会自动处理Ajax请求。例如: ```html , @item, method: :delete, data: { remote: true } %> ``` 在上述代码中,当用户点击链接时,...

    Laravel重定向,a链接跳转,控制器跳转示例

    本篇文章将深入探讨Laravel中的重定向方法,包括通过`a`标签、表单提交、Ajax请求以及控制器方法内的跳转。 1. **`a`链接跳转**: 在HTML中,`<a>`标签用于创建超链接,直接指定URL即可实现页面跳转。在Laravel中,...

    ext session失效 页面跳转

    这通常是通过Ajax请求完成的。如果后端返回的响应表明Session已过期,EXT应用可以触发一个事件,该事件负责处理页面的跳转。 实现这个功能,开发者通常会在EXT应用中的某个全局或关键位置(如路由控制器)设置一个...

    Ajax 中的Sys.Webforms.PageRequestManagerParseErrorException异常处理

    在使用ASP.NET AJAX时,可能会遇到一种特定的异常——`Sys.Webforms.PageRequestManagerParseErrorException`。这个异常通常发生在使用UpdatePanel进行异步更新时,由于服务器返回的响应内容无法被客户端的...

    java面试题库(j2ee,j2se,ssh,ajax)

    2. **JavaScript**:处理Ajax请求,包括创建请求对象、发送请求、处理响应数据。 3. **JSON**:比XML更轻量的数据交换格式,常用于Ajax通信。 4. **jQuery等库**:简化Ajax操作,如$.ajax()函数。 面试题中还可能...

    h5和微信授权头像,jq封装ajax源码

    在获取微信授权头像的场景中,我们可以创建一个函数,接收必要的参数,如appid、appsecret、redirect_uri等,然后使用jQuery的AJAX方法发起HTTP请求。 ```javascript function getWechatAvatar(appid, appsecret, ...

    AJAX弹出框_利用ScriptManager.RegisterStartupScript

    - 但当需要在服务器端进行某些逻辑处理后再显示提示时,直接在客户端写死 JavaScript 代码的方式就不再适用,此时可以使用 `ScriptManager.RegisterStartupScript` 方法动态注册 JavaScript 代码。 #### 实现细节 -...

    codeigniter使用例程 网站跳转管理系统

    在这个例程中,可能通过JavaScript(可能使用jQuery库)发送异步请求到控制器,控制器处理请求后返回数据,再由JavaScript更新DOM元素,实现动态网站跳转管理。 5. 数据库操作: `redirect.sql`文件可能包含了创建...

    ASP.NET 的一个上传、跳转等待进度条源代码

    在ASP.NET中,这可以通过设置`Response.Redirect()`的延迟执行,或者使用`Page.ClientScript.RegisterStartupScript()`来添加自定义的JavaScript脚本实现页面跳转前的等待效果。 源代码可能包含了以下关键部分: 1...

Global site tag (gtag.js) - Google Analytics