页面树结构

版本比较

标识

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。

在系统集成中,用户为了统一门户,一般都会要求多个系统实现单点登录。在第三方系统中通过编写 JavaScript 代码,调用 Smartbi 浏览器端SDK 中的方法进行登录即可。浏览器端SDK 通过 JavaScript API 提供多个客户端组件供外部调用,满足非 J2EE 平台的客户环境(如.Net平台)实现与 Smartbi 系统的集成要求。

Image Removed

 

具体操作步骤如下:

1、首先部署Smartbi服务器。假设Smartbi已经部署到应用服务器中,访问地址为:在第三方系统中编写 JSP 页面调用 Smartbi 的服务器端 SDK 进行登录。此方式适用于“在第三方系统中打开Smartbi资源”、“在第三方系统中新建Smartbi资源”和“在第三方中打开功能模块”,而不适用于从第三方系统链接转到Smartbi。具体操作步骤如下:

  1. 参考开发接口中的服务端SDK方法 的使用步骤,把相关的 jar 包加载到您的 Java 项目的 classpath 中。
  2. 编写登录代码,调用 SDK 中的相应方法。
  3. 可以将得到的smartbiCookie 作为参数传入openresource.jsp等页面,必须转码后再传递,例如<a href="http://
localhost
  1. server:8080/smartbi

 
2、将导航到smartbi\vision\js\freequery\lang\JSLoader.js拖放到本地文件夹中,然后将其添加到自己的项目中。如果使用的是smartbi.war,则可用WinRAR之类的压缩工具打开部署文件smartbi.war并导航到smartbi.war\vision\js\freequery\lang目录下,来获得JSLoader.js。

Image Removed

   
3、需要修改添加到项目中的JSLoader.js文件。打开该文件,将最后部分的9行代码注释或删除掉,下图中红色矩形框标示的部分。

Image Removed

   
4、在第三方系统处理用户登录的代码位置(比如登录成功后的代码处理分支处),插入以下单点登录Smartbi的代码。对调用login方法的返回结果进行测试,为true则登录成功;否则登录失败。

Image Removed

5、完整的示例代码如下。 代码块languagexml
  1. /vision/openresource.jsp?resid=<资源ID>&smartbiCookie=<%=java.net.URLEncoder.encode(conn.getCookie(), "UTF-8")%>">

 

代码块
firstline1
linenumberstrue
<HTML><%@ <HEAD>
    <TITLE>第三方系统如何单点登录到Smartbi </TITLE>
    <SCRIPT type="text/javascript" src="/js/JSLoader.js"></SCRIPT>
</HEAD>
<BODY>
<SCRIPT LANGUAGE="JavaScript">
    //smartbi服务器的URL地址page contentType="text/html; charset=GBK" import="java.util.*,
    smartbi.sdk.ClientConnector,
    smartbi.sdk.service.user.UserManagerService" %>
<%
    request.setCharacterEncoding("GBK");
    String user ="admin";
    varString configpassword = new Object();"manager";
    String config.baseURLsmartbiURL = "http://localhost:808018080/smartbi/vision/";
    var BOF_UI_DEBUGClientConnector conn = false;new ClientConnector(smartbiURL); 
    // 创建全局唯一的JS装载器建立此连接时,就对smartbi进行了登录
    varboolean jsloaderret = new JSLoader(config);
 conn.open(user, password);
    if (!ret) {
        %>
        <script>
   // 创建应用程序对象     var userService = jsloader.importsalert("bof.usermanager.UserService登录失败!");
        // 通过userService.getInstance()可以调用所有的UserManagerModule方法.</script>
        <%
    } else {
        %>
 var result = userService.getInstance().login("admin", "manager");   <script>
 if (result) {         alert("OK登录成功!");
            // 获取smartbi的cookie,在集成页面需要传递smartbiCookie值,以保证前后台cookie的一致性
    } else {      var smartbiCookie  alert("登录失败");= "<%=conn.getCookie()%>";
       } </SCRIPT>
</BODY>
</HTML>

注意:gif演示示例的源码请参考:使用浏览器端SDK单点登录到Smartbi.rar

6、至此单点登录就完成了。但是如果Smartbi与第三方系统部署在不同的机器上,或者部署在同一机器不同的应用服务器域下,即出现跨域访问,则系统在访问过程中有可能出现各种奇怪问题。解决跨域访问,请参考:Smartbi与第三方系统集成跨域问题解决办法。 
script>
        <%
    }
%>
注意
title注意!

JSLoader.js不支持file协议,如果使用该js库的HTML直接在本地打开会报错下面的错误。必须要将其部署到网络上,通过HTTP等协议访问才能正常工作。

报错信息如下:XMLHttpRequest cannot load ${本地URL}. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.如果 Smartbi 是集群部署模式,则不能采用本方法进行单点登录。

原因是ClientConnector对象是在jsp页面的java代码块中初始化的,其发起对象是第三方系统服务器,而集成资源是浏览器发起的,浏览器在使用该cookie时,不能保证跟服务器一样访问到同一个节点,在没有访问到同一个节点时,其cookie是无效的。