跨域问题解决方案

跨域访问报表,可以理解为在两台不同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中有如下

<param-name>reportPath</param-name>

<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>

</context-param>

修改成:

<context-param>

<param-name>reportPath</param-name>

<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

说明一点:

配置的端口可以不一致,但是前提是:在路由器配置端口转发的地方必须将用到的端口都包含进去。

如下图: