ajax错误处理与CORS的预期不同

时间:2016-02-08 18:17:36

标签: ajax cors

我在CORS上遇到了另一个问题。我为ajax做了一个设置来处理一些错误,但问题是现在有些问题从未被跨域请求触发。

我知道不可能捕获预检(超时),因为它们是由浏览器触发的,是吗?但我认为应该可以通过.e.g捕获内部服务器错误。 GET之后。错误处理在没有CORS的情况下工作(结果500转换为0)

我从未调用的设置:

jQuery.ajaxSetup({
        statusCode: {

            500: function (data, textStatus, jqxhr) {

                if (data.status === 500) {
                    window.location.hash = "#error";
                }
            }
        }
    });

GET请求:

    jQuery.ajax({
        url: url,
        type:'GET',
        timeout:1000
    }).done (function (data, textStatus, jqXHR) {
        updateCookie (jqXHR);
        Logger.log("finished loading " + log);
        callback(data);

    }).fail (function (data, textStatus, jqXHR) {
        Logger.log("failure loading " + log);

    });

有人提示我如何解决这个问题吗? 问候

更新: Ok再次调试,发现失败被调用但是0f 500 - >返回状态0。

预检成功后的GET请求:

Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0
Accept: */*
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
X-CSRF-TOKEN: 11258a06-36ea-4a21-a935-d215fcc92714
X-Requested-With: undefined
Origin: null
Connection: keep-alive

在尝试获取已删除的资源时,服务器的响应按预期进行:

Connection: close
Content-Language: en
Content-Type: text/html;charset=utf-8
Date: Mon, 08 Feb 2016 20:33:12 GMT
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
statusCode: 500

而不是这500是在ajax设置状态0调用。

1 个答案:

答案 0 :(得分:1)

CORS规范在Cross-Origin Request with Preflight部分下列出:

  

在制作预检请求时,应遵守以下请求规则:

     

...

     

如果响应的HTTP状态代码不在2xx范围内

     
      
  • 应用网络错误步骤。
  •   
     

如果出现网络错误

     
      
  • 如果出现DNS错误,TLS协商失败或其他类型的网络错误,请应用网络错误步骤。请勿要求任何类型的最终用户互动。
  •   

因此,满足500响应或遇到超时(或任何其他网络故障)的预检会触发规范的网络错误步骤。" network error steps与一般CORS失败时使用的错误步骤相同(例如,允许错误的来源,根本不存在CORS头等):

  

每当应用网络错误步骤时,请终止调用此一组步骤的算法,并将跨源请求状态设置为网络错误

在浏览器环境中," 网络错误"状态对应于状态0

为了防止这种情况发生,服务器必须确保预检不会失败。或者,更改您的请求以使其简单(即,仅使用简单的方法和标题),因此不需要预检。