我在使用HTML5 + Phonegap
的移动应用程序开发工作。目前我正在使用XMLRPC
和其工作良好的移动应用程序。(Android和iOS)
我需要工作相同的应用程序作为website in browsers
。(使用HTML5)。但是当我试图在网站上运行我的应用程序时,我得到这个错误:
XMLHttpRequest cannot load 'Client' URL'. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost <http://localhost/>' is therefore not allowed access.
当我搜索专家说,使用JSONP。但是使用相同的XMLRPC方法,我可以工作吗?
例如;
登录的目的是使用;
$.xmlrpc({
url: 'http://clienturl/xmlrpc/common',
methodName: 'login',
params: [Database_name','user_name','Password'],
success: function(response, status, jqXHR) {
alert('success'); },
error: OnError
});
作为一个移动应用程序运行良好。
但是当我试图作为一个网站运行时,得到Access-Control-Allow-Origin
跨域问题。
默认情况下,SOP(同源策略)允许跨域请求,但它阻止接收这些请求的响应。错误消息中的Access-Control-Allow-Origin
是CORS(跨域资源共享)标头。它告诉浏览器,您允许通过从另一个域(XMLRPC客户机的域)发送请求来读取域(XMLRPC服务器的域)的响应。所以如果你想用AJAX调用它,你必须从服务器发回CORS允许头。
注意:CORS不能在旧的浏览器中工作。
可能的解决方式:
-
如果从
http://localhost
调用http://clienturl/xmlrpc/common
,则response.header('Access-Control-Allow-Origin', "*")
是一个不那么安全的解决方案,根据这一点:Origin http://localhost不被Access-Control-Allow-Origin允许但是你总是可以为你的客户端添加另一个主机名(例如http://client.xml.rpc),例如通过windows,你可以修改hosts文件并使用IIS服务器添加绑定。
我不推荐这个解决方案,因为它是一个安全风险与允许凭据头
-
另一个更安全的选择是列出允许的主机列表,检查您从哪个主机收到实际请求,并发送正确的头:
if (allowedHosts.contains(request.host)) if (request.host== "http://localhost") response.header('Access-Control-Allow-Origin', "null"); else response.header('Access-Control-Allow-Origin', request.host); else response.header('Access-Control-Allow-Origin', server.host);
这是多主机的正确解决方案,因为如果您允许*的凭据,那么每个人都可以读取和写入登录用户的会话。
通过
http://localhost
和file:///
IRIs,您必须使用null
原点。我不确定其他协议,我猜在当前的浏览器中,你也必须使用null
来源。