【问题标题】:overcoming access-control-allow-origin in simple web map site克服简单 web 地图站点中的访问控制允许来源
【发布时间】:2014-03-22 03:03:12
【问题描述】:

我正在尝试建立一个简单的网页,该网页将使用一些 openstreetmap 数据绘制地图。我现在在本地机器的端口 8000 上使用(python)simpleHTTPserver 为该页面提供服务。

在我的页面中,我运行一个向 openstreetmap.org 发送 AJAX 请求的脚本:

$(document).ready(function() {
    console.log ("Document is loaded.");

    var map = L.mapbox.map('mapsection', 'examples.map-vyofok3q');

    $.ajax({
      url: "http://www.openstreetmap.org/api/0.6/way/252570871/full",
      dataType: "xml",
      success: function (xml) {
        var layer = new L.OSM.DataLayer(xml).addTo(map);
        map.fitBounds(layer.getBounds());
      }
    }); // end ajax
});

(L. 指的是我包含的 Leaflet javascript 库。)我遇到了同源策略错误的问题。 Chrome 说:“XMLHttpRequest 无法加载 http://www.openstreetmap.org/api/0.6/way/252570871/full。请求的资源上没有 'Access-Control-Allow-Origin' 标头。因此不允许访问 Origin 'null'。”

在本地提供 HTTP 服务时,我遵循了一个有希望的 SO 答案 Can I set a header with python's SimpleHTTPServer? 的建议,所以我运行了 $ python ajax-allower.py 其中 ajax-allower.py 包含以下代码。你能解释为什么我仍然会收到错误,并建议我如何解决它吗?

#!/usr/bin/env python
# runs the simple HTTP server while setting Access-Control-Allow-Origin
# so that AJAX requests can be made.
import SimpleHTTPServer

class MyHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_my_headers()

        SimpleHTTPServer.SimpleHTTPRequestHandler.end_headers(self)

    def send_my_headers(self):
        self.send_header("Access-Control-Allow-Origin", "http://www.openstreetmap.org")
        #self.send_header("Access-Control-Allow-Origin", "*")


if __name__ == '__main__':
    SimpleHTTPServer.test(HandlerClass=MyHTTPRequestHandler)

【问题讨论】:

    标签: ajax openstreetmap same-origin-policy mapbox simplehttpserver


    【解决方案1】:

    ajax 请求失败,因为有问题的对象是deleted

    如果您尝试使用仍然存在的对象(例如http://www.openstreetmap.org/api/0.6/way/666/full),您的 jQuery 代码应该可以完美运行。或者,如果您获取已删除对象的完整历史记录 (http://www.openstreetmap.org/api/0.6/way/252570871/history),但我想这可能不是您真正想要的。

    应该说,API 可能还应该为失败的(HTTP 410 Gone)请求发送 CORS 标头,以便您的客户端可以检测到错误代码。这看起来像是一个应该报告的错误on github

    【讨论】:

    • 谢谢。我已经按照你的建议报告了这个错误,github.com/openstreetmap/openstreetmap-website/issues/708
    • 在请求您指向的现有资源时,我的同源问题消失了。 (谢谢。)我曾认为拒绝允许 DOM 更改的责任在于我原来的 Web 服务器,我使用 SimpleHTTPserver 启动的那个,我在问题中输入了它的代码。但是您的评论表明负责的服务器是我向其发出 AJAX 请求的 OSM 服务器。对吗?
    • 是的。但是,如果您(同时)仍想使用您的 python 代理脚本,则必须为 Access-Control-Allow-Origin 标头设置 your 域,不是openstreetmap.org(或者只是在注释行中使用通配符*)。
    • 你能推荐一个好地方/书/视频/网站来自学同源政策的基础知识吗?
    • 嗯,我猜this list on enable-cors.org 是一个很好的起点。除此之外,我只知道wikipedia pageofficial specs
    猜你喜欢
    • 2017-06-19
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    相关资源
    最近更新 更多