页面树结构
转至元数据结尾
转至元数据起始

(nginx的方案源于网上资料,本文档仅供参考)

Smartbi 与第三方系统部署在不同的机器上,或者部署在同一机器不同的应用服务器域下,双方系统集成时经常出现跨域访问。

随着Chrome新版本对跨域cookie传递的限制趋严,苹果设备上Safari浏览器等对跨域cookie传递的限制,需要解决跨域问题的场景逐渐增多,解决跨域最常用的方案是部署代理,比如F5和nginx等常见的第三方代理都可以配置代理smartbi,其中nginx的反向代理功能的解决方案是很方便的,以下举例说明nginx的配置方案。

环境背景

nginx所在机器的ip:10.10.101.73

nginx配置监听端口:80

第三方系统地址首页:http://10.10.12.87:8080/SmartbiSSO

smartbi地址首页:http://10.10.202.17:18600/smartbi

第三方系统和smartbi不在同一台服务器,则如果http://10.10.12.87:8080/SmartbiSSO下的页面通过iframe等方式引用http://10.10.202.17:18600/smartbi下的页面容易出现跨域问题导致chrome浏览器中不能单点登录,或者登录成功后无法正常使用报表的一些功能(比如跳转规则,客户端宏的子窗口调用父窗口的代码不能正常执行)的情况。

配置示例

基于上述环境,以下是nginx解决跨域问题的一个参考配置:

 
#user  root root;                                                                
worker_processes  1;                                                           
events {                                                                        
    worker_connections  1024;                                                   
}                                                                               
http {
	include  mime.types;
	default_type application/octet-stream;
	sendfile  on;
	keepalive_timeout 65;
	server {
    listen       80;
    server_name  localhost 10.10.101.73;
    #charset koi8-r;
    
    resolver 8.8.8.8;
	#代理smartbi,为了防止出现重定向等问题,location后的名称建议与proxy_pass 地址的中的上下文一致,此处都写/smartbi/
     location /smartbi/  {
            proxy_pass         http://10.10.202.17:18600/smartbi/ ;
            proxy_set_header   Host             $host:$server_port;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            client_max_body_size 1000m;
            client_body_buffer_size 128k;
            proxy_connect_timeout 90;
            proxy_send_timeout 300;
            proxy_read_timeout 300;
            proxy_buffer_size 4k;
            proxy_buffers 4 32k;
            proxy_busy_buffers_size 64k;
            proxy_temp_file_write_size 64k;
        }
		#代理第三方系统SmartbiSSO,/SmartbiSSO/需要根据外部第三方系统上下文名称自行修改,如果上下文是空,建议写 /
		location /SmartbiSSO/  {
            proxy_pass         http://10.10.12.87:8080/SmartbiSSO/ ;
            proxy_set_header   Host             $host:$server_port;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            client_max_body_size 1000m;
            client_body_buffer_size 128k;
            proxy_connect_timeout 90;
            proxy_send_timeout 300;
            proxy_read_timeout 300;
            proxy_buffer_size 4k;
            proxy_buffers 4 32k;
            proxy_busy_buffers_size 64k;
            proxy_temp_file_write_size 64k;
        }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }   
	}
}

使用上述配置启动nginx后,浏览器需要通过nginx的ip去访问smartbi和第三方系统,即:

第三方系统地址首页:http://10.10.101.73/SmartbiSSO

smartbi地址首页:http://10.10.101.73/smartbi

集成方案

如果在第三方系统下有一个页面:http://10.10.101.73/SmartbiSSO/report.jsp需要引用smartbi的报表,则report.jsp集成smartbi报表的地址需要使用http://10.10.101.73/smartbi/vision/openresource.jsp?resid=XXXXXX这种格式,对于访问第三方系统的用户,通过http://10.10.101.73/SmartbiSSO的入口去访问第三方系统的页面引用的smartbi报表就不会存在跨域问题。

核心是两点:

  • 浏览器访问的第三方系统地址包含nginx所在的ip(域名)和端口(协议默认端口则省略)
  • 第三方系统中的页面集成的smartbi的地址也包含一致的nginx的ip(域名)和端口(协议默认端口则省略)

从浏览器端看,访问第三方系统的地址和第三方系统集成的smartbi地址关系如下图:


Viewtracker License Missing

There is a problem with the license of the Viewtracker addon. Please check if you have a valid license.

授权码细节

评论

  1. 孙鑫 发表:

    跨域问题的解决方案说明
    【举例】第三方OA地址: 10.10.10.12/oa
    【举例】Smartbi系统地址:10.10.10.11/smartbi
    如果在第三方OA中通过Iframe的方式集成Smartbi资源,由于两套系统的域不一致,会出现跨域问题,导致集成失败,针对这种情况有如下2种方案
    方案一:重新构造一层反向代理
    重新构造一层反向代理,在反向代理中进行域的统一
    比如在10.10.10.10 节点部署nginx,并进行分发配置
    使其访问第三方OA的地址变成:10.10.10.10/oa
    使其访问Smartbi应用的地址变成:10.10.10.10/smartbi
    这样在OA中使用【10.10.10.10/smartbi】集成Smartbi的资源,客户使用【10.10.10.10/oa】地址访问OA
    方案二:在OA层进行方向代理映射
    2.1 如果OA层有反向代理
    需要在OA层增加一条分发规则:使Smartbi系统可以进行【10.10.10.12/smartbi】方式访问
    2.2 如果OA层没有反向代理
    需要在OA层部署一套Smartbi_proxy应用(此应用功能类似反向代理,会把所有访问的请求进行转发给真实的Smartbi应用节点【需要在Smartbi_proxy配置即可)),使其Smartbi可以进行【10.10.10.12/smartbi_proxy】方式访问