与visualize.js一起使用时,对Jasper报告的基于令牌的身份验证失败

时间:2015-09-01 12:24:52

标签: jasper-reports visualize

我正在使用Jasper 6.1并配置我的服务器以允许基于令牌的身份验证。当我使用令牌从浏览器登录时,它工作正常。使用有效令牌,我无需输入用户名和密码即可进入系统。

现在,我正在将它与visualize.js集成,以便在我们的应用程序的网页上显示报告。以下是请求电话: -

var authToken = encodeURIComponent("u=jsmith|r=admin|exp=20150831172506-0800|t=ABC");
visualize.config({
server: "http://localhost:8080/jasperserver-pro",
scripts: "optimized-scripts",
logEnabled: true,
logLevel: "error",
auth: {
token: authToken,
preAuth: true,
tokenName: "pp"
}}, function (v) {
   $scope.v = v;
   $scope.reportingInitialized = true;
   $scope.$digest();
}, function (err) {
         alert("Auth error! Server said: " + err.message);
});

但是,在成功验证后,它不会重定向到成功URL,而是使用HTTP代码200返回以下html。由于验证失败,错误消息为“Unexpected token<”。

感谢您的任何帮助。

<head>
<title></title>
<meta http-equiv="refresh" content="0;url=home.html">
<script language="javascript" type="text/javascript">
window.location="home.html";
</script>
</head>
<body>
If your browser doesn't automatically go there,
you may want to go to <a href="home.html">the destination</a>
manually.
</body>
</html>

4 个答案:

答案 0 :(得分:1)

以下是此问题的解决方案,以获取其他好处:

applicationContext-externalAuth-preAuth.xml中缺少jsonRedirectUrl

<property name="jsonRedirectUrl" ref="authSuccessJsonRedirectUrl"/>

此外,还需要从此文件中删除以下行,以便显示报告而不会出现任何错误:

 <!-- marker disabling JIAuthenticationSynchronizer: pre-5.1 external auth config-->
    <alias name="${bean.authenticationProcessingFilter}" alias="proxyAuthenticationProcessingFilter"/>

以上解决方案已经过测试并在Jasper Server 6.1上运行

答案 1 :(得分:0)

我已经安装了JRS 6.1和:

  • 在 已经在applicationContext-externalAuth-preAuth.xml

  • 我评论了#34;别名......&#34;行

但是,当我刷新报告页面时,报告不会显示。我必须删除我的cookie才能显示报告。

它真的对你有用吗?

答案 2 :(得分:0)

我们发现问题是第一个请求建立了一个会话。如果在第一个会话仍处于活动状态时发送带有第二个请求的新令牌,则请求将失败。您需要修改应用程序以继续对浏览器会话使用相同的令牌,或者在发送第二个请求之前注销用户。

答案 3 :(得分:0)

这是visualize.js身份验证的预期行为,所以这里有2个选项,我在我的应用程序中使用

方法1

根据visualize.js文档重用身份验证调用

使用visualize.configure

visualize.config({
  auth: {
    token: "token",
    organization: "organization_1"
  }
});

然后使用visualize函数来提供报告1和报告2

// report 1
visualize(function(v) {
  v("#container1").report({
    resource: "/public/Samples/Reports/06g.ProfitDetailReport",
    error: function(err) {
      alert(err.message);
    }
  });
});

// report 2
visualize(function(v) {
  v("#container2").report({
    resource: "/public/Samples/Reports/State_Performance",
    error: function(err) {
      alert(err.message);
    }
  });
});

方法2

这种方法是不可取的。每次要显示报告时都要执行以下操作

  • 发送登录电话
  • 提供报告
  • 发送退出电话