如何将Tableau server中的视图嵌入web页面

Tableau作为可视化数据分析软件中的佼佼者,将数据运算与美观的图表完美地嫁接在一起。它的程序很容易上手,各公司可以用它将大量数据拖放到数字“画布”上,转眼间就能创建好各种图表。创建与共享绝妙的数据可视化内容,Tableau 为您呈上唾手可得的可视化分析能力。它帮助您生动地分析实际存在的任何结构化数据,以在几分钟内生成美观的图表、坐标图、仪表盘与报告。利用 Tableau 简便的拖放式界面,您可以自定义视图、布局、形状、颜色等等,帮助您展现自己的数据视角。另外他还适用于多种数据文件与数据库,数据可扩展性强,不限制您所处理的数据大小。

首先讲一下我们今天用到的Tableau的模块吧:tableau desktop 是用来创建分析,进行数据分析的,是分析工具。tableau server 是用来发布分析的,发布给企业相关权限的人,是服务器。

接下来就让我们了解一下tableau嵌入视图的原理吧。

Snipaste_2019-06-03_14-21-18.png

1、客户端请求数据:当用户访问具有嵌入式 Tableau Server 视图的网页时,该客户端会向 Web 服务器发送请求,要求返回页面地址。

2、Web 服务器请求Tableau Server:Web 服务器向受信任的 Tableau Server发送请求。该请求必须有一个 username 参数。username 值必须是 Tableau Server 许可用户的用户名。如果 Tableau Server 承载多个站点,且视图在默认站点之外的其他站点上,则 POST 请求还必须包含 target_site 参数。

3、Tableau Server 创建票证:Tableau Server 检查发送请求的 Web 服务器的 IP 地址或主机名。如果 Web 服务器作为受信任主机列出,则 Tableau Server 将以唯一字符串的形式创建一个票证。票证必须在发出后三分钟内兑换。Tableau Server 使用该票证来响应 POST 请求。或者,如果存在错误并且无法创建票证,则 Tableau Server 将使用值 -1 进行响应。

4、Web 服务器将 URL 传递给客户端:Web 服务器将为视图构建 URL,并将其插入网页的 HTML 中。Web 服务器将 HTML 传递回客户端的 Web 浏览器。

5、客户端向Tableau Server 请求视图:客户端 Web 浏览器将向 Tableau Server 发送一个请求,该请求包括带有票证的 URL。

6、Tableau Server 兑换票证:Tableau Server 兑换票证,创建会话,将用户登录,从 URL 中移除票证,然后将嵌入视图的最终 URL 发送到客户端。

最后让抛出重要的代码来讲解一下:

服务端代码:

public String index(){
    PropertiesUtils props = PropertiesUtils.getInstance();
    //tableau server服务器地址
    final String wgserver = props.getProperty("tableau.server.location");
    //Tableau Server 许可用户的用户名
    final String tableAuUser = props.getProperty("tableau.user");
    String ticket;
    String tickUrl = "";
    try {
        ticket = TableauHelper.getTrustedTicket(wgserver, tableAuUser);
        if ( !ticket.equals("-1") ) {
            tickUrl = "http://" + wgserver + "/trusted/" + ticket + "/view/names";
        }
    } catch (ServletException e) {
        logger.error("获取tableau ticket 失败。 ",e);
    }
    setAttr("tickUrl",tickUrl);
    render("tableau.html");
}
//获取票证逻辑
public static String getTrustedTicket(String wgserver, String user)
    throws ServletException {
        OutputStreamWriter out = null;
        BufferedReader in = null;
        try {
            StringBuilder reqUrl = new StringBuilder();
            reqUrl.append(URLEncoder.encode("username", "UTF-8"));
            reqUrl.append("=");
            reqUrl.append(URLEncoder.encode(user, "UTF-8"));
            URL url = new URL("http://" + wgserver + "/trusted");
            URLConnection conn = url.openConnection();
            conn.setDoOutput(true);
            out = new OutputStreamWriter(conn.getOutputStream());
            out.write(reqUrl.toString());
            out.flush();

            StringBuilder rsp = new StringBuilder();
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                rsp.append(line);
            }
            return rsp.toString();
            
        } catch (Exception e) {
            throw new ServletException(e);
        } finally {
            try {
                if (in != null)
                    in.close();
                if (out != null)
                    out.close();
            } catch (IOException e) {
            
            }
        }
    }

前台代码

<!DOCTYPE html>
<html>

<head>
    <title>tableau页面</title>

    <script type="text/javascript"
            src="https://public.tableau.com/javascripts/api/tableau-2.min.js"></script>
    <script type="text/javascript">
        function initViz() {
            var containerDiv = document.getElementById("vizContainer");
            var url = document.getElementById("tickUrl").value;
            options = {
                hideTabs: true,
                //隐藏底部所有按钮
                //hideToolbar:true,
                onFirstInteractive: function () {
                    console.log("Run this code when the viz has finished loading.");
                }
            };

            var viz = new tableau.Viz(containerDiv, url, options);
        }
    </script>
</head>

<body onload="initViz();">
<div id="vizContainer">
</div>
<input id="tickUrl" type="hidden" value="${tickUrl}">
</body>

</html>

这样我们就完成了将tableau server中的视图嵌入自己的页面中。

Tableau JavaScript API:https://onlinehelp.tableau.com/current/api/js_api/en-us/JavaScriptAPI/js_api.htm

Tableau Server获取票证:https://onlinehelp.tableau.com/current/server/zh-cn/trusted_auth_webrequ.htm

Tableau编写嵌入代码:https://onlinehelp.tableau.com/current/pro/desktop/zh-cn/embed_code.htm

嵌入代码的参数:https://onlinehelp.tableau.com/current/pro/desktop/zh-cn/embed_list.htm

在这里再说几个参数吧

:alerts(values为yes或者no):隐藏工具栏中的“通知”按钮,该按钮使用户能创建数据驱动型通知。
:customViews(values为yes或者no):隐藏工具栏中的“视图”按钮,该按钮使用户能保存自定义视图。
:showShareOptions(values为true或者false):控制是否在嵌入视图中显示“共享”选项。
:device(values为desktop、tablet、phone):屏幕大小及布局属性。

想了解更多学习知识,请关注微信公众号“阿Q说”,获取更多学习资料吧!你也可以后台留言说出你的疑惑,阿Q将会在后期的文章中为你解答。每天学习一点点,每天进步一点点。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,076评论 1 32
  • 一、在浏览器地址栏输入URL 当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配到你想要的 URL ...
    饥人谷_CST阅读 908评论 0 1
  • 原文链接:https://docs.spring.io/spring-boot/docs/1.4.x/refere...
    pseudo_niaonao阅读 4,672评论 0 9
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,381评论 1 45
  • 第一最爱是我血肉 割舍后悔痛般隐忍 我终身感谢的人 伤口即愈亦留痕 第二最爱像一根刺 被刺痛后悔悟至深 让我感谢自...
    副正阅读 127评论 0 3