天地图截屏打印时安全沙箱冲突的解决办法
自己用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();
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
通过这种代理的方式,用户可以随心所欲地截图与打印了。
必须说明的是,这种代理的方式,客户端要取得瓦片,经过了两个服务器,一个是国家天地图服务器,一个是本地服务器,在响应速度方面肯定会受一定的影响的。