天地图截屏打印时安全沙箱冲突的解决办法

自己用flex api写的调用国家天地图的应用程序在发布到服务器上之后,发现在打印和截屏的时候会出现“安全沙箱冲突”的错误信息

其实这是flex的一种安全策略

关于解决这种冲突的方法,网上说的天花乱坠,各种解决方法,本人比较熟悉的是以下两种方式

1)在地图服务器根目录下放置crossdomain.xml跨域文件

2)写代理

由于国家天地图服务器远在首都,基本上方法1) 目前来说无法实现,所以只能通过方法2)写代理的方式

本人写了一servlet实现代理天地图瓦片服务的功能

String type = request.getParameter("T");
String x = request.getParameter("X");
String y = request.getParameter("Y");
String l = request.getParameter("L");

long index = Math.round(Math.random() * 7);
/*
 * 一幅完整的图片url有如下格式:
http://tile0.tianditu.com/DataServer?T=siwei0608&X=6666&Y=1406&L=13
 
*/
String spec = "http://tile" + index + ".tianditu.com/DataServer?T=" + type + "&X=" + x + "&Y=" + y + "&L=" + l;
URL url = new URL(spec);
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream();

response.setContentType("image/png");
OutputStream outputStream = response.getOutputStream();
byte b[] = new byte[1];
while (-1 != inputStream.read(b, 0, 1))
    outputStream.write(b, 0, 1);
inputStream.close();
outputStream.close();

发布此servlet之后,在flex api中浏览地图,通过fire bug跟踪发现客户端取的瓦片地址是本机发布的代理地址

http://localhost:8080/xtgeomaps_app/GJTianditu?T=siwei0608&X=6666&Y=1406&L=13

而不是

http://tile0.tianditu.com/DataServer?T=siwei0608&X=6666&Y=1406&L=13 

 通过这种代理的方式,用户可以随心所欲地截图与打印了。

必须说明的是,这种代理的方式,客户端要取得瓦片,经过了两个服务器,一个是国家天地图服务器,一个是本地服务器,在响应速度方面肯定会受一定的影响的。

posted @ 2012-05-22 20:46  爱生活,爱GIS  阅读(1382)  评论(1编辑  收藏  举报