XMLRPC请求中的Access-Control-Allow-Origin问题

时间:2014-06-03 06:46:49

标签: ajax html5 cross-domain xml-rpc

使用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跨域问题。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

默认情况下,SOP (same origin policy)允许跨源请求,但它会阻止接收这些请求的响应。错误消息中的Access-Control-Allow-OriginCORS (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://localhostfile:/// IRI,您必须使用null来源。我不确定其他协议,我想在当前的浏览器中你也必须使用null来源。