2015-11-13 94 views
0

欢迎您提供建议或推荐的解决方案。科尔多瓦XmlHttp请求IP地址被阻止

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

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

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

错误responseText为空,http代码为-1。该请求在出口处被阻止,并且从未将其发送到打印机。

科尔多瓦版本:5.3.3 应用:HTML5 + AngualrJS 1.4.3(此调用使用原始的XmlHttpRequest)

科尔多瓦配置(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(); 
+0

你使用的是iOS 9吗? –

+0

是的。我正在使用iOS 9. – Rusty

+0

好的,请参阅我的答案,您将面对App Transport Security配置。 –

回答

1

如果您在iOS 9你可能来了对App交通运输安全限制在默认情况下将不允许非SSL端点连接,不管什么科尔多瓦的内容安全性政策设置为。这是iOS9的新功能。

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

配置应用程序传输安全打开你的项目的-Info.plist文件,并添加:

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

即禁用ATS,并允许任何HTTP主机连接不使用SSL。如果你想限制到主机的特定主机或一组,你知道这些在编译的时候你可以用这种形式:

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

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

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

+0

这是ATS和CSP。我向我的plist添加了NSAppTransportSecurity。这仍然没有解决问题,但很重要。然后我读博客。我的问题是打印机不支持https,科尔多瓦的默认CSP限制连接。打印开始工作时,我删除了内容安全策略元标记。然后我回到了Cordova默认的内容安全策略,并修改它为我的应用工作:content =“default-src *'unsafe-eval'data:gap :; connect-src:*; style-src *'unsafe-一致'”。谢谢西蒙! – Rusty