IIS环境下OpenLayers使用WFS服务跨域访问问题之解决方案

本文介绍了解决OpenLayers在IIS环境下遇到的跨域访问问题。通过安装Python并配置IIS来支持.py文件,利用代理脚本来实现跨域请求。具体步骤包括设置环境变量、配置IIS、修改代理脚本等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
请注明转载,版权所有 zhuhuazha@gmail.com.
OpenLayers以其优越的性能、广泛的支持和近乎完美的地图展现和处理能力而拥有无数的FANS。但它毕竟是一个纯JS库,利用ajax方法完成地图要素和信息的动态加载,因此它本身也免不了ajaxjavascript的一些限制,比如跨域访问问题。浏览器了为安全起见,是不允许js执行跨域访问的,在openlayers官方Wiki中提到使用wfsGeoRSS这两个服务是会遇到跨域访问的问题的。
比如如下的鼠标单击事件添加wfs查询:
map.events.register('click', map, function (e) {
    //获取当前鼠标位置
    clickPos = map.getLonLatFromPixel(e.xy);
    leftPos = map.getLonLatFromPixel( new OpenLayers.Pixel(e.xy.x-gTolerance, e.xy.y-gTolerance) );
    rightPos = map.getLonLatFromPixel( new OpenLayers.Pixel(e.xy.x+gTolerance, e.xy.y+gTolerance) );
    bounds = new OpenLayers.Bounds();
    bounds.extend( leftPos );
    bounds.extend( rightPos );
    //构建GetFeature参数
    var params = {
REQUEST: "GetFeature",
        BBOX: bounds.toBBOX(),                                                       maxFeatures:'10',
        srsName: 'EPSG:4326',
        service: 'WFS',
        version: '1.0.0',
        //PropertyName: properName,
        typeName:gLayerNames
};
        //执行查询
        OpenLayers.loadURL("http://192.168.0.161:8080/geoserver/wfs", params, this, setHTML, setHTML);  //161是另一台机器用来做地图服务
        OpenLayers.Event.stop(e);
});
       在 IE或者 firefox里面执行时, 会因为跨域的问题报错:拒绝访问或者缺少对象。     

       OpenLayers为我们提供了一个参考解决方案。在examples目录里面,有个proxy.cgi文件,然后在init函数中添加如下如句:

OpenLayers.ProxyHost = ‘/cgi-bin/proxy.cgi?’

    但网上不论中文还是英文,都随处可见基于Apache的解决方法,但IIS下解决方案始终未能搜到。今天,为此作一试验,成功解决该问题,方法相对也比较简便,在此一述,以飨后来人。

       首先安装Python, 比如我安装到C:/Python24,安装完毕后,设置环境变量:Path,添加路径到Path之后。

       其次,在IIS网站上添加py应用支持。在网站属性,主目录,配置,选项,应用程序映射,添加。可执行文件选择c:/python24/python.exe %s %s 注意后面的两个%S,%s是指字符串。扩展名写上.py。这样iis就支持运行py程序了。

       然后,拷贝proxy.cgi程序到网站目录下,随意放哪个文件夹下,我放在wwwroot/mybin。将Proxy.cgi改名为proxy.py(很重要噢)。更改proxy.py第一行

#!/usr/bin/env python为#!C:/Python24/python.exe -u,原来的是linux下的,修改的则为windowsg上的。


       最后,在html页面中OpenLayersinit部分加上如下语句:

OpenLayers.ProxyHost = ‘/mybin/proxy.py?url=’

    OK。大功告成。同仁们不妨一试。

OpenLayers在处理访问问题时,可以通过使用代理来解决。一种常见的方法是在JavaScript代码中使用代理。在代码中添加`OpenLayers.ProxyHost="cgi/proxy.cgi?url="`这句话可以解决访问问题。这样,当访问的资源时,OpenLayers会将请求发送到代理服务器,代理服务器再将请求发送到目标服务器,并将响应返回给OpenLayers。这样就可以绕过浏览器的同源策略限制,实现访问。\[1\] 另外,有时候清除浏览器缓存也可以解决问题。当使用`crossOrigin: 'anonymous'`属性时,如果瓦片使用了内置缓存,可能会导致问题。清除浏览器缓存后再次加载页面可以解决这个问题。\[2\] 还有一种方法是使用代理脚本。将`proxy.py`脚本放到网站目录下,并在代码中添加`OpenLayers.ProxyHost='http://localhost:80/mybin/proxy.py?url='`这句话。然后通过URL访问网页时,OpenLayers会将请求发送到代理脚本,代理脚本再将请求发送到目标服务器,并将响应返回给OpenLayers。这样也可以实现访问。\[3\] #### 引用[.reference_title] - *1* [openlayer访问问题解决方案](https://blog.youkuaiyun.com/yiranaiu/article/details/44673979)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [OpenLayers加载在线地图问题](https://blog.youkuaiyun.com/weixin_43336525/article/details/130248985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [2014-01-05 20:58 OpenLayers访问WFS问题IIS)](https://blog.youkuaiyun.com/dreamgis/article/details/41448547)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值