????? 最近开发的模块需要用到跨域访问的方式,本来想可能会有跨域直接使用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标签的方式。