Cordova XmlHttpRequest到IP地址被阻止

时间:2015-11-13 20:58:01

标签: ios cordova printing cors

欢迎您提出建议或建议的解决方案。

我有一个使用RESTful服务的Cordova应用程序。应用程序需要在运行时指定的IP地址向打印机发送请求。该打印机是支持WebPRNT的Star Micronics热敏打印机(它有一个Web服务器,可以接受带打印作业的POST请求)。

在Chrome中运行时,打印和RESTful服务正常工作。当我在iPad上部署Cordova时它失败了。我可以在iPad上的Safari中打开应用程序并成功发送打印作业。由于某种原因,Cordova似乎阻止了打印机的POST。 RESTful服务是使用域名的外部服务(CORS)。打印机正在使用IP。两者都使用POST方法。只有打印机出现故障。

我正在使用RestAngular进行应用程序和RESTful服务之间的通信。我正在使用Star Micronics' SDK(使用裸XmlHttpRequest的JavaScript)将请求发送到打印机。我尝试使用RestAngular,Angular的$ http和JQuery向服务器发送请求。没有工作。

错误responseText为null,http代码为-1。此请求在出口处被阻止,并且从未进入打印机。

Cordova版本:5.3.3 App:HTML5 + AngualrJS 1.4.3(此调用使用原始XmlHttpRequest)

Cordova配置(config.xml):

<plugin name="cordova-plugin-whitelist" version="1" />
<access origin="*" />
<access origin="content:///*" />
<allow-intent href="*" />
<allow-navigation href="*" />

我已经尝试了上述几种变体,指明了IP明确性等等。没有任何效果。

HTML元内容安全政策:

<meta http-equiv="Content-Security-Policy" content="connect-src * http://IP_HERE; ">

我已尝试将内容安全策略的多种变体与config.xml中的设置结合使用。没有任何效果。

当我从浏览器发送时,打印机会回复这些标题:

Access-Control-Allow-Credentials → true
Access-Control-Allow-Headers → origin, content-type
Access-Control-Allow-Methods → POST, GET, OPTIONS
Access-Control-Allow-Origin → *

以下是进行调用的代码(裁剪为StarWebPrintTrader.js)。完整的JS文件包含在Star Micronics' SDK中:

var c=null;
if(window.XMLHttpRequest)
    c=new XMLHttpRequest;
else if(window.ActiveXObject)
    c=new ActiveXObject("Microsoft.XMLHTTP");
else{
    if(this.onError)
        this.onError({status:10001,responseText:"XMLHttpRequest is not supported."});
    return
}
try{
    c.open("POST",b,!0)
}
catch(f){
    if(this.onError)
        this.onError({status:10002,responseText:f.message});
    return
}
c.setRequestHeader("Content-Type","application/xml; charset=UTF-8");
c.onreadystatechange=function(){alert('state change')};
c.send();

1 个答案:

答案 0 :(得分:1)

如果您使用的是iOS 9,则可能会遇到App Transport Security限制,无论Cordova的内容安全策略设置如何,默认情况下都不允许连接到非SSL端点。这是iOS9上的新功能。

在这种情况下,您需要设置App Transport Security例外并配置内容安全策略以允许访问相同的主机。

要配置App Transport Security,请打开项目的-Info.plist文件并添加:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

禁用ATS并允许连接到没有SSL的任何http主机。如果您想限制特定主机或主机集,并且您在构建时知道这些主机,则可以使用此表单:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
      <key>myhost.mydomain.com</key>
      <dict>
        <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
        <true/>
    </dict>
  </dict>
</dict>

并根据需要指定例外域列表。

有一个blog post here可以更详细地解释这一点。