CORS HTTP重定向(30x)后面没有Android / iOS WebView

时间:2014-04-11 10:37:48

标签: javascript android webview xmlhttprequest cors

情景:

  • WebView(Android 4.x)通过http(不是file://)
  • 加载页面
  • 该页面包含xhr请求(本机或jQuery,相同结果)到另一个域上的资源
  • 资源通过307(或任何其他30x,相同的结果)重定向到另一个资源(某个域或不是,相同的结果)
  • 我得到了臭名昭着的"错误",以及任何其他信息

请注意:

  • 如果它不是重定向,则请求已满了
  • 如果所有资源都在同一台服务器上,则请求已完成
  • 为重定向的资源和最后一个
  • 设置CORS标头
  • 在Chrome或Firefox上一切正常
  • 我掌控一切(Android App,服务器和网页)
  • "手动"重定向工作,如果我点击A元素,WebView将遵循307
  • WebView没有点击最终的URL,这显然意味着它在第一个响应中检测到错误
  • 我不使用BASE元素

JS代码基本上就是这个

var url = "http://xxxxxx/zot"; var oReq = new XMLHttpRequest(); oReq.onerror = function() { // I received the error }; oReq.onload = function(e) { // Not reached }; oReq.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

(尝试删除所有这些,部分等等)

1 个答案:

答案 0 :(得分:2)

我发现了这个问题。遗憾的是,WebViews倾向于在每个请求中发送自定义标头,并且该事实将触发具有预检类型请求的 CORS。但我有一个重定向,标准禁止明确禁止预检请求(http://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0,第3节)

  

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

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