Javascript CORS HTTP重定向(30x)后不跟随Android/iOS WebView

Javascript CORS HTTP重定向(30x)后不跟随Android/iOS WebView,javascript,android,webview,xmlhttprequest,cors,Javascript,Android,Webview,Xmlhttprequest,Cors,情景: WebView(Android 4.x)通过http(非文件:/)加载页面 该页面包含对另一个域上的资源的xhr请求(本机或jQuery,相同结果) 资源通过307(或任何其他30x,相同结果)重定向到另一个资源(某个域或非域,相同结果) 我得到了臭名昭著的“错误”,还有其他信息 请注意: 如果不是重定向,则请求已满 如果所有资源都在同一台服务器上,则请求已满 CORS头是为重定向的资源和最终资源设置的 在Chrome或Firefox上,一切都能完美运行 我掌控一切(Android

情景:

  • WebView(Android 4.x)通过http(非文件:/)加载页面
  • 该页面包含对另一个域上的资源的xhr请求(本机或jQuery,相同结果)
  • 资源通过307(或任何其他30x,相同结果)重定向到另一个资源(某个域或非域,相同结果)
  • 我得到了臭名昭著的“错误”,还有其他信息
请注意:

  • 如果不是重定向,则请求已满
  • 如果所有资源都在同一台服务器上,则请求已满
  • CORS头是为重定向的资源和最终资源设置的
  • 在Chrome或Firefox上,一切都能完美运行
  • 我掌控一切(Android应用程序、服务器和网页)
  • “手动”重定向起作用,如果我单击某个元素,WebView将遵循307
  • WebView没有命中最终的URL,这(显然)意味着它在第一次响应中检测到错误
  • 我不使用基本元素
JS代码基本上就是这个


变量url=”http://xxxxxx/zot";
var oReq=新的XMLHttpRequest();
oReq.onerror=函数(){
//我收到了错误
};
oReq.onload=函数(e){
//未达到
};
open(“GET”,url,true);
oReq.send();

由第一个请求吐出的头:

HTTP/1.1 307 Temporary Redirect
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: connection,host,accept-language,accept-encoding,accept-charset,user-agent,origin,cache-control,pragma,referer,origin,X-Requested-With,x-requested-with,accept-charset,x-wap-profile,x-getzip, Access-Control-Allow-Origin,X-HTTP-Method-Override,Content-Type,Authorization,Accept
Access-Control-Allow-Methods: GET, POST, OPTIONS
Location: http://10.90.7.10:3030/r/vast
Date: Fri, 11 Apr 2014 09:40:01 GMT
Connection: keep-alive

(尝试移除全部、部分等)

我发现了问题。不幸的是,WebViews倾向于在每个请求中发送自定义头,这一事实将触发具有飞行前类型请求的CORS。但是我有一个重定向,对于飞行前的请求,这是标准明确禁止的(,第3节)

如果响应的HTTP状态代码不在2xx范围内[然后]应用网络错误步骤


例如,我的XPeria T正在发送
x-wap-profile
x-getzip
,但也发送
x-request-with

您引用了规范的错误部分。您链接到了预照明部分,但引用了简单的CORS请求部分。此外,您还错误地引用了该部分。对于简单的CORS请求,允许重定向。如果返回301-308,则遵循以下步骤。如果在飞行前的响应中接收到非2xx,则该请求被视为失败。规范的相关部分是:“如果响应的HTTP状态代码不在2xx范围内……请应用网络错误步骤。”您是对的。我发现了问题,但我过快地完成了规范。