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



我在使用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://localhostfile:/// IRIs,您必须使用null原点。我不确定其他协议,我猜在当前的浏览器中,你也必须使用null来源。

相关内容

  • 没有找到相关文章

最新更新