代码改变世界

js不能拦截302

2017-12-29 13:35  brookin  阅读(1115)  评论(0编辑  收藏  举报

302跳转是浏览器自动处理并跳转

You can't handle redirects with XHR callbacks because the browser takes care of them automatically. You will only get back what at the redirected location.

当服务器将302响应发给浏览器时,浏览器并不是直接进行ajax回调处理,而是先执行302重定向——从Response Headers中读取Location信息,然后向Location中的Url发出请求,在收到这个请求的响应后才会进行ajax回调处理。大致流程如下:

ajax -> browser -> server -> 302 -> browser(redirect) -> server -> browser -> ajax callback

由于302返回的重定向URL在服务器上没有相应的处理程序,所以在ajax回调函数中得到的是404状态码;如果存在对应的URL,得到的状态码就是200。
所以,如果你想在ajax请求中根据302响应通过location.href进行重定向是不可行的。

$.ajax({
    url: 'http://test.com',
    type: 'post',
    complete: function(jqXHR){
        console.log('complete', jqXHR.status);
    },
    error: function (xhr) {
        console.log('error', xhr.status);
    }
});