跨域问题解决方案
跨域访问报表,可以理解为在两台不同IP段的机器上访问报表。
先简单介绍一下跨域的具体情况:
A, B两台机器,分别部署了两个应用。
A机器的IP:192.168.0.41 域名:runqian1.vicp.net
B机器的IP:192.168.0.50 域名:runqian5.vicp.net
A机器上部署了报表应用,是服务端;B机器是客户端。
在B应用的web.xml中有如下配置:
<context-param>
<param-name>reportPath</param-name>
<param-value>http://192.168.0.41:8081/demozj</param-value>
</context-param>
然后在B机器的iframe.jsp中通过iframe引入了B机器应用中的kuayu.jsp,在kuayu.jsp中通过window.location=”<%=reportPath%>/reportJsp/showReport.jsp?raq=/testxlrl.raq”;去访问A机器上应用中的报表
(JSP中的具体内容可见附件)
在B机器的IE地址栏中输入:
Http://192.168.0.50:8080/demo/reportJsp/iframe.jsp
应用会跳转到:
http://192.168.0.41:8081/demozj/reportJsp/showReport.jsp?raq=/testxlrl.raq
Testxlrl.raq是个带参数模版的报表,其中有下拉数据集,下拉列表框和下拉日历。而在跨域访问报表时,所表现出来的具体问题是:下拉框和下拉日历一律不能点击,点击时无任何反应,且页面报脚本错误,提示:servlet拒绝访问。
出现这个错误的原因是:报表的下拉控件中用到一个名为creatPopup()的js方法,该方法本书是拒绝跨域访问的。
js跨域问题,是在一个域下的页面中通过js访问另一个不同域下的数据对象,出于安全性考虑,几乎所有浏览器都不允许这种跨域访问。
这并非是报表产品的问题。
但是对于这种情况,报表目前有一种解决办法:使用document.domain=“二级域名”的方式。
使用document.domain方法有以下几个前提:
1. 在web.xml中只能配置域名和端口。
即将:
<context-param>
<param-name>reportPath</param-name>
<param-value>http://192.168.0.1:8081/demozj</param-value>
</context-param>
修改成:
<context-param>
<param-name>reportPath</param-name>
<param-value>http://runqian1.vicp.net:8081/demozj</param-value>
</context-param>
2.只能使用域名访问应用。
3.二级域名必须一致。
以上三个条件必须同时遵守,且不能违反任意一条。
具体步骤如下:
1. 统一两台服务器的二级域名(www.1.baidu.com 中baidu.com就是二级域名)
a) A,B两天机器的二级域名都是:vicp.net
2. 在涉及到的所有JSP中加入一下代码:
<script type=”text/javascript”>
document.domain=”vicp.net”;
</script>
该例中就需要在iframe.jsp,kuayu.jsp和A机器上的showReport.jsp中都加入这句话。
3. 使用域名加端口的方式来访问应用,如:
http://runqian5.vicp.net:8080/demo/reportJsp/iframe.jsp
说明一点:
配置的端口可以不一致,但是前提是:在路由器配置端口转发的地方必须将用到的端口都包含进去。
如下图: