页面树结构

版本比较

标识

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

...

代码块
languagejava
public class SmartbiToken {
    public static void main(String[] args) throws Exception {
        // 1、准备加密参数
        String secretKey = "12345678";// 密钥
        long timestamp =  new java.util.Date().getTime();// 必需是毫秒数的时间戳
        String userName = "admin";  // 用户名,可基于业务动态获取
        String password = "admin";  // 用户密码(可选),可基于业务动态获取

        // 准备加密的JSON串,用户密码可选
        String loginInfo= "{\"username\":\"" + userName + "\",\"password\":\"" + password + "\",\"timestamp\":" + timestamp + "}";

        // 2、进行加密
        String token  = CryptoUtil.encrypt(AlgorithmType.DES, loginInfo, secretKey);
        // 3、链接转码
        String encodedToken = java.net.URLEncoder.encode(token, "UTF-8");
        // 4、拼接登录链接
        String url = "http://localhost:8080/smartbi/vision/loginByToken?smartbiToken=" + encodedToken;

        // 6、拼接登录后的跳转请求5、拼接登录后的跳转请求
        String targetPath = "openresource.jsp?resid=I2c94ea86298cbe6c01298cfd9ba900fa";
        targetPath = java.net.URLEncoder.encode(targetPath, "UTF-8");
        String endUrl = url + "&targetPath=" + targetPath;
        System.out.println(endUrl);
    }
}

...

加密部分主要有主要有两种算法DES加密和AES-GCM加密

  • DES加密:CryptoUtil.encrypt(AlgorithmType.DES, loginInfo, 密钥)。
  • AES-GCM加密:smartbi.crypto.CryptoUtil.encrypt(loginInfo, 密钥) 或 CryptoUtil.encrypt(AlgorithmType.AES_GCM, loginInfo, secretKey)

注意秘钥长度,如果秘钥不是8个字符的,使用AES-GCM加密加密会报错如下:The key length must be 16 bytes


(3)链接转码

拿到令牌之后需要对令牌进行url转码,如果是Java系统可以使用 java.net.URLEncoder.encode(token, "UTF-8")进行转码,js代码则可以使用encodeURIComponent函数来进行转码。如果说不转码的情况下,同样会出现问题1“解析令牌失败”的问题。


(4)拼接登录链接

拼接的单点地址需要使用loginByToken,然后smartbiToken参数用来指定token:"http://localhost:8080/smartbi/vision/loginByToken?smartbiToken=" + encodedToken;

(5)拼接登录后的跳转请求

登录完成之后,需要使用targetPath参数来指定跳转之后需要拼接的地址,这个地址在拼接到最终请求之前同样需要进行url转码,否则在openresource的请求里,当设置集成报表的参数时,会将集成的参数当成是loginByTokenq请求的参数,导致openresource请求传参失败,具体可以参考如下图中的请求参数信息。