js跨域调用报表

基于效率的原因,将页面和报表部署在不同服务器上,在页面中引入报表。此时如果想通过页面上的按钮对报表进行操作就会出现问题,无法调用报表的函数,IE提示没有权限,这就是javascript的跨域问题。Javascript出于安全性考虑,是不允许跨域调用其他页面的对象的。所以上述看似很普通的操作没办法实现。
这样的需求应该是很普遍的,这也是一个经典的问题,网上相关文章很多但是没有一个完美的解决方案,只能根据自己的需要来进行设置。
现在我们使用apache反向代理ProxyPassmod_rewrite,实现页面按钮跨域调用润乾报表函数

具体设置方法:
先安装2.2版的apache服务器。打开配置文件conf\httpd.conf

先启用相关的功能,去掉这几项前面的“#”
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule rewrite_module modules/mod_rewrite.so

(在文件的最下面添加下面的几个设置)

(页面要通过apache访问)
<IfModule mod_rewrite.c>
 RewriteEngine On
 RewriteRule ^/show/(.*)$  http://192.168.0.84:8080/show/$1
</IfModule>

(遇到/show的请求会自动跳转。例如:apache的服务的路径为192.168.0.1:80
当输入http://192.168.0.1:80/show/show.jsp时,浏览器自动跳转到http://192.168.0.84:8080/show/show.jsp页面)

(报表页面通过apache调用)
ProxyRequests Off
ProxyPass /report  balancer://name stickysession=jsessionid nofailover=On
<proxy balancer://name/>
    BalancerMember http://192.168.28.131:8080/demo  loadfactor=1
</proxy>

(报表raq文件通过apache调用)
ProxyPass /reportFiles  balancer://name stickysession=jsessionid nofailover=On
<proxy balancer://name/>
    BalancerMember http://192.168.28.131:8080/demo  loadfactor=1
</proxy>
(ProxyPass
为代理转发的Url,即将所有访问/report的请求转发到群集下面设置的服务器上。
loadfactor
为各主机间的负载比例参数,可是设置不同指数
BalancerMember
为群集的成员,可以设置多个,即群集服务器AB,负载均衡服务器会根据均衡规则来将请求转发给BalancerMember(现在只设置一个)
例如:apache的服务的路径为192.168.0.180
当程序中引用的报表路径为http://192.168.0.1:80/report/jsp/report.jsp 时,apache会引入http://192.168.28.131:8080/demo/jsp/report.jsp这个文件)

以上是Apache服务器的设置。
对于报表服务器还要做一些设置,因为经过了apache的转发会造成路径不对,设置固定的路径。
在报表服务器应用中的reportConfig.xml文件中设置
<config>
  <name>appUrlPrefix</name>
  <value>http://192.168.0.84:80/report</value>
</config>

通过上面的设置,在进行访问的时候,所有的页面都处在同一个域中。js可以实现跨域调报表函数的功能。

热门文章