最近开发的模块需要用到跨域访问的方式,本来想可能会有跨域直接使用JavaScript读取页面内容的方法,结果Google了几天,没有发现有相关的解决方案。暂时可以下个结论:跨域访问时,不能直接在两个窗口之间读取数据(假如被读取窗口是直接返回数据的除外)。比如有窗口A和B,B窗口有一个<input>元素,直接从A窗口不能读取这个元素的value值。目前的结论是如此,假如哪位大牛不小心闲逛进来,发现我的结论是错误的,请一定给我留言指正我的错误。
跨域访问解决方案主要有以下几种。
1、服务器Proxy。
实际上就是在服务器端获取跨域的数据。好处是可以返回任何类型的数据。
目前见得比较多的是使用HttpClient来实现,代码大致如下:
String url = "*****";
HttpClient client = new HttpClient();
HttpMethod method = new GetMethod(url);
try {
// Execute the method.
int statusCode = client.executeMethod(method);
if (statusCode != HttpStatus.SC_OK) {
//输出
}
// Read the response body.
byte[] responseBody = method.getResponseBody();
}
catch (HttpException e) {
//异常输出
}
catch (IOException e) {
//异常输出
}
finally {
// Release the connection.
method.releaseConnection();
}
2、动态Script标签。
由前端获取跨域的数据,好处在于不用经过服务器端,避免增加服务器端的压力。但是这种方法要求返回的数据是JSON格式,同时需要额外的处理避免浏览器垃圾回收出现问题(直译下面给出的链接中的语句)。
http://neil.fraser.name/news/2009/07/27/这个链接给出了完整的解决方案。
同时,一些JS框架也给出了自己的相应的解决方案。比如ExtJS,使用Ext.data.ScriptTagProxy来实现(API中有详细的使用方法),不过不清楚这个实现有没解决上面说到的垃圾回收问题,有时间再深入了解。
3、隐藏Iframe。
这个解决方案只能用在同一个父域的跨域中。
经过上面的了解后,目前用第一种方式实现了跨域访问,不过准备把所有的实现修改为第二种,即动态Script标签的方式。