使用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
跨域问题。
我该如何解决这个问题?
答案 0 :(得分:1)
默认情况下,SOP (same origin policy)允许跨源请求,但它会阻止接收这些请求的响应。错误消息中的Access-Control-Allow-Origin
是CORS (cross-origin resource sharing)标头。它告诉浏览器您允许通过从另一个域(您的XMLRPC客户端域)发送请求来读取域(您的XMLRPC服务器域)的响应。因此,如果要使用AJAX调用它,则必须从服务器发回CORS允许标头。
注意:CORS在旧浏览器中不起作用。
可能的解决方案:
如果您从http://clienturl/xmlrpc/common
拨打http://localhost
,那么
response.header('Access-Control-Allow-Origin', "*")
是一个不太安全的解决方案:Origin http://localhost is not allowed by 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:///
IRI,您必须使用null
来源。我不确定其他协议,我想在当前的浏览器中你也必须使用null
来源。