展现报表的基本办法
用户可以通过传入报表资源ID(ResID)或报表文件名称的方式展现指定的报表。
展现页面中会自动判断出报表是填报表还是普通报表,如果是填报表,则会显示出填报表特有的工具栏按钮,例如数据提交按钮。
传递resID展现报表
有些用户会希望可以这样简单地调用报表:
showReport.jsp?resId=xxxx¶m1=xxxx
但这种方法存在以下问题:
- 极不安全:任何人只要修改参数值,就可以随意查看其他报表,或者查看此报表的其他内容。
- 当参数较长时URL无法传递,如果涉及中文编码也很麻烦。
因此,需要基于以下的通过JS的调用方式,并对调用参数进行安全保护。
对报表资源ID进行保护的安全调用方式代码:
// 引入模块调用入口的js文件
<script type="text/javascript" src="/reportmis/mis2/security/js/ModuleEntry.js"></script>
<script type="text/javascript">
function srByresID(){
//这里引用后台计算出来的安全校验信息值
// 要传递的参数,resID:报表的资源ID。
var params="{resID:'10052'}";
<%
Map
paramMap = new HashMap
();
//将报表资源ID加入安全校验信息
paramMap.put("resID","10052");
// 生成安全校验信息
String secInfo = Security.generate(request, paramMap);
%>
// 调用产品报表展现模块
// "SR"为展示报表的模块ID,params为要传递的参数,secInfo是安全验证信息,"_blank"表示新窗口打开。
new ModuleEntry('SR', params, "<%=secInfo%>", '_blank','').enter();
}
</script>
<a href="#" onClick="javascript: srByresID();', '', '_blank','').enter();">查看报表</a>
//将报表资源ID加入安全校验信息
paramMap.put("resID","10052");
// 生成安全校验信息
String secInfo = Security.generate(request, paramMap);
%>
// 调用产品报表展现模块
// "SR"为展示报表的模块ID,params为要传递的参数,secInfo是安全验证信息,"_blank"表示新窗口打开。
new ModuleEntry('SR', params, "<%=secInfo%>", '_blank','').enter();
}
</script>
<a href="#" onClick="javascript: srByresID();', '', '_blank','').enter();">查看报表</a>
传递报表文件名称展现报表
示例代码:
<// 引入安全校验类
<%@ page import="com.runqianapp.security.entry.sec.Security"%>
<// 引入Base64加密类
<%@ page import="com.runqianapp.common.base64.Base64"%>
// 引入模块调用入口的js文件
<script type="text/javascript" src="/reportmis/mis2/security/js/ModuleEntry.js"></script>
// 引入Base64加密的js文件
<script type="text/javascript" src="/reportmis/mis2/gezComponents/jsUtils/Base64.js"></script>
<script type="text/javascript">
function srByraq(){
// 要传递的参数,fileNameWithPathB64:报表文件路径需要经过Base64加密。
var params="{fileNameWithPathB64,'"+new Base64().encode('flexdesigner/reportFiles/10052.raq')+"'}";
<%
Map
paramMap = new HashMap
();
//将报表资源ID加入安全校验信息
paramMap.put("fileNameWithPathB64",Base64.encode("flexdesigner/reportFiles/10052.raq"));
// 生成安全校验信息
String secInfo = Security.generate(request, paramMap);
%>
// 调用产品报表展现模块
// "SR"为展示报表的模块ID,params为要传递的参数,secInfo是安全验证信息,"_blank"表示新窗口打开。
new ModuleEntry('SR', params, "<%=secInfo%>", '_blank','').enter();
}
</script>
<a href="#" onClick="javascript:srByraq()', '', '_blank','').enter();">查看报表</a>
//将报表资源ID加入安全校验信息
paramMap.put("fileNameWithPathB64",Base64.encode("flexdesigner/reportFiles/10052.raq"));
// 生成安全校验信息
String secInfo = Security.generate(request, paramMap);
%>
// 调用产品报表展现模块
// "SR"为展示报表的模块ID,params为要传递的参数,secInfo是安全验证信息,"_blank"表示新窗口打开。
new ModuleEntry('SR', params, "<%=secInfo%>", '_blank','').enter();
}
</script>
<a href="#" onClick="javascript:srByraq()', '', '_blank','').enter();">查看报表</a>
在资源列表获取安全调用展现代码
1、打开资源中心列表,找到对应的资源,在其列上右键,选择右键菜单中的复制信息
2、复制调用代码后的输入框中的代码,将其放入对应的jsp中,展现时调用showReport_xxx(),xxx是报表id
注意:上面引入的类及js文件,在调用页面存在则不需重复引入
示例jsp代码:
<!--引入类及js开始,请确认页面是否已引入对应的类及js,不必重复引入-->
<%@ page import="java.util.Map"%>
<%@ page import="java.util.TreeMap"%>
<%@ page import="com.runqianapp.security.entry.sec.Security"%>
<script type="text/javascript" src="<%=request.getContextPath()%>/mis2/security/js/ModuleEntry.js"></script>
<!--引入类及js结束-->
<script type="text/javascript">
function showReport_32237(){
var params = {resID : 32237};
<%
Map<String, String> paramMap = new TreeMap<String, String>();
paramMap.put("resID", "32237");
String secInfo = Security.generate(request, paramMap);
%>
new ModuleEntry("SR", params, "<%=secInfo%>", "_blank").enter();
}
//上述内容为复制的调用代码
//展现时调用showReport_xxx()
window.onload=function(){
showReport_32237();
}
</script>