如果修改 XHR,则 JQuery AJAX 请求失败并出现 CORS 错误

Posted

技术标签:

【中文标题】如果修改 XHR,则 JQuery AJAX 请求失败并出现 CORS 错误【英文标题】:JQuery AJAX request fails with CORS error if modifying XHR 【发布时间】:2016-03-30 19:37:40 【问题描述】:

我正在使用 JQuery 将文件上传到服务器,并且工作正常。由于一些用户会上传大文件,我想添加一个进度条,这就是事情变得时髦的地方。我找到了大约 10 种不同的解决方案(包括这里),但它们都不适用于我的场景。

我发布到不同的来源(这是我无法改变的事实)。这有效:

 $.ajax(
    url: "xxx",
    type: 'POST',
    data: data,
    cache: false,
    dataType: 'json',
    processData: false, // Don't process the files
    contentType: false, // Set content type to false as jQuery will tell the server its a query string request
    success: function(data, textStatus, jqXHR)
    
        if(typeof data.error === 'undefined')
        
            console.log('Success');
        
        else
        
            console.log('ERRORS: ' + data.error);
        
    ,
    error: function(jqXHR, textStatus, errorThrown)
    
        console.log('ERRORS: ' + textStatus);
    
);

但是我一触碰XHR对象,比如这里要添加一个onprogress监听器:

Can onprogress functionality be added to jQuery.ajax() by using xhrFields?

我的代码变成了:

 $.ajax(
    url: "xxx",
    type: 'POST',
    data: data,
    cache: false,
    dataType: 'json',
    processData: false, // Don't process the files
    contentType: false, // Set content type to false as jQuery will tell the server its a query string request
    xhr: function()
    
      var xhr = new window.XMLHttpRequest();
      xhr.upload.addEventListener("progress", function(evt)
        if (evt.lengthComputable) 
          var percentComplete = evt.loaded / evt.total;
          console.log(percentComplete);
        
      , false);
      return xhr;
    ,
    success: function(data, textStatus, jqXHR)
    
        if(typeof data.error === 'undefined')
        
            console.log('Success');
        
        else
        
            console.log('ERRORS: ' + data.error);
        
    ,
    error: function(jqXHR, textStatus, errorThrown)
    
        console.log('ERRORS: ' + textStatus);
    
);

我在浏览器中收到以下错误:

跨域请求被阻止:同源策略不允许读取 xxx 处的远程资源。 (原因:缺少 CORS 标头“Access-Control-Allow-Origin”)。

使用 Firefox 进行测试,但更改不是一个真正的选择,这需要在大多数流行的浏览器上工作。

所以基本上,我可以发布跨域并且它可以工作。只要我想监控它的进度,它就会失败。

我尝试过的其他方法:

将 onprogress: 添加到 $.ajax() 使用 XHRFields 各种不同形式的xhr:function()

我一接触 XHR 对象,就会被 CORS 拒绝。万一你想知道,网络服务器(Apache)是这样设置的:

Header set Access-Control-Allow-Origin "*"

感谢您的意见,我已经在这工作了好几个小时了,无法展示血腥的进展。在这方面花费的时间比实际应用程序本身要多。

这是 JQuery 1.7.1 - 我无法升级它。

有没有人知道为什么我修改 xhr 对象时不允许使用不同的来源?

干杯

斯蒂芬

【问题讨论】:

【参考方案1】:

如果您在本地测试,请尝试在 url 中使用 localhost 而不是 0.0.0.0 ,如果可行,请告诉我

【讨论】:

我没有在本地测试 - 我真的没有选择这样做。 我在 POST 中使用的 URL 是这种形式:host:port/mod_owa/procedure

以上是关于如果修改 XHR,则 JQuery AJAX 请求失败并出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

jQuery里面的ajax方法的参数

jquery ajax请求的五个步骤

使用 jQuery 中止 JSONP ajax 请求

javascript 从服务器请求数据(fetch,XHR和jQuery Ajax)

在 jQuery 中停止 XHR 请求

产生ajax跨域问题的原因