OpenLayers加载在线地图跨域问题

        使用OpenLayers的ol/layer/WebGLTile类加载在线地图瓦片时,瓦片加载不出来,在此记录一下解决过程。

        先贴一下代码~ 

<body>
    <h2>My Map</h2>
    <div id="map"></div>
    <script>
        var map = new ol.Map({
            target: 'map',
            layers: [
                // webGL渲染
                new ol.layer.WebGLTile({
                    source: new ol.source.XYZ({
                        url: 'http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}',                        
                    }),
                })
            ],
            view: new ol.View({
                center: [117.06667, 39.66667],
                projection: 'EPSG:4326',
                zoom: 3
            })
        })
    </script>
</body>

        在这里使用的是 ArcGIS在线的瓦片,运行之后发现地图乌漆嘛黑一片,打开开发者工具发现瓦片数据已经请求过来了,但是没有显示出来,可以想到可能是出现跨域问题了。

        参考自https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image

        通过在将加载图像的HTMLImageElement上设置crossorigin属性,告诉浏览器在下载图像数据时请求跨域访问。

        在这里将图层设置中使用crossOrigin: 'anonymous'(匿名的),图像成功显示,但出现一个问题,有一些瓦片显示不出来,而且报跨域的问题!

        就很纳闷,上面不是已经把跨域问题解决了吗?为什么还报错呢?接着就是一顿查!

        有人说ArcGIS Server默认服务端口由6080改成6443,协议也由http改为https。不过使用原来的http+6080访问地图服务,Server会对请求自动重定向,本地仍能访问到地图服务。但是,如果其他计算机使用http+6080访问地图服务时,浏览器会提示跨域问题。

        然后我就把代码里的http改成了https,发现瓦片果然全部加载了,而且没有出现跨域200报错,虽然地图显示了,但不知道原理是什么,又是一顿查...

        顺便学习了一下跨域报错的状态码,参考自javascript - ajax跨域,这应该是最全的解决方案了 - 程序生涯 - SegmentFault 思否

跨域状态码产生的原因解决方法

404

服务器端后台接口没有允许OPTIONS请求,导致无法找到对应接口地址

后端允许options请求

405

这种现象和第一种有区别,这种情况下,后台方法允许OPTIONS请求,但是一些配置文件中(如安全配置),阻止了OPTIONS请求,才会导致这个现象

 后端关闭对应的安全配置

200

服务器端后台允许OPTIONS请求,并且接口也允许OPTIONS请求,但是头部匹配时出现不匹配现象。比如origin头部检查不匹配,比如少了一些头部的支持(如常见的X-Requested-With头部),然后服务端就会将response返回给前端,前端检测到这个后就触发XHR.onerror,导致前端控制台报错

后端增加对应的头部支持

200

后台响应的http头部信息有两个Access-Control-Allow-Origin:*

建议删除代码中手动添加的*,只用项目配置中的即可

        后来发现好像和ArcGIS Server重定向没有什么关系,查看瓦片地址的时候,发现很多瓦片都来自于内置缓存,想了一下之前添加crossOrigin: 'anonymous'时,也是保存代码后直接刷新了html界面,瓦片可能用的是内置缓存。清除浏览器缓存后,再次加载,解决200跨域问题!

上述为个人学习探索过程,如果不对之处请大家批评指正~ 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值