知识库

推荐内容

快逸做的更好

产品优势

您的位置: 首页 > 知识库 > 设计基础 > 快逸报表自定义函数实现超链接传递参数加密

快逸报表自定义函数实现超链接传递参数加密

Web报表的数据钻取是一个非常强大实用的功能,涉及到这个功能通常是通过带参数的超连接传递实现的,有参数的传递就要考虑参数的安全性问题。因此,如何能够实现数据钻取时,对超链接中传递的参数加密是很多web报表用户关注的问题。

快逸报表实现数据钻取是相当简单的,尽管快逸报表没有明确提出参数加密的方法,但是使用自定义函数便能简单的实现这个功能。

实现思路:

自定义一个加密函数,在报表复杂报表设计" target="_blank" class="quieeLink1">设计的超链接中调用该函数,把参数先经加密函数加密后再传递到结果页面,最后在结果页面接收加密参数再解密。

下面根据一个例子来介绍如何使用快逸自定义函数实现对参数的加密功能。

第一步:编写自定义加密函数

快逸报表自定义函数的标准写法是:继承快逸报表提供的Function类或者DSFunction类,实现其中的calculate方法,并返回运算结果。

本示例中的加密采用Java中的MD5方式,加密类名为EncryptionClass,继承快逸报表提供的Function类,代码如下:

public class EncryptionClass extends Function{
public Object calculate(Context ctx, boolean isInput) {
/* MessageDigest 提供了消息摘要算法,如 MD5 或 SHA的功能。消息摘要是安全单向散列函数,它采用任意大小的数据并输出一个固定长度的散列值。
*/
MessageDigest md5=null;
try {
//获取MD5方式的加密实例md5
md5 = MessageDigest.getInstance(”MD5″);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
//判断自定义函数接收到得参数个数,如果个数为0,则抛出异常信息
if ( this.paramList.size() < 1 ) {
MessageManager mm = EngineMessage.get();
throw new ReportError(”encrypt:” +mm.getMessage(”function.missingParam”));
}
/*如果参数个数不为0,示例中每次只传递一个参数,因此只取下标为0的第一个参数。
取得第一个参数,默认为表达式,需要把该表达式算出来,结果才是函数的参数值
*/
//取得第一个参数的表达式param1
Expression param1=(Expression)this.paramList.get( 0 );
//判断参数是否为空,如果为空抛出异常信息
if (param1 == null) {
MessageManager mm = EngineMessage.get();
throw new ReportError(”encrypt:” + mm.getMessage(”function.invalidParam”));
}
//如果不为空,算出第一个参数的具体值,默认状态下返回类型为object
Object result1 = Variant2.getValue(param1.calculate(ctx, isInput), false, isInput);
//将计算出来的object类型的参数值转成String类型
String res = (String)result1;
//下面是MD5的加密算法实现
char[] charArray = res.toCharArray();
byte[] byteArray = new byte[charArray.length];
for (int i=0; i<charArray.length; i++) {
byteArray[i] = (byte) charArray[i];
}
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append(”0″);
}
hexValue.append(Integer.toHexString(val));
}
//返回自定义类的结果hexValue,这也是通过MD5方式加密后的密文
return hexValue.toString();
}
}

第二步:应用中登记快逸报表自定义函数

1, 将编译加密类后生成的.calss文件拷贝到应用中WEB-INF/classes目录下

2, 在应用中WEB-INF/classes/config目录下找到customFunctions.properties,并在其中进行自定义类及类名的登记,增加如下内容:

jmClass=0,EncryptionMiClass

第三步:设计测试自定义加密类使用的快逸报表

使用快逸报表设计器,新建一个空白的报表,在单元格内增加如下内容:

1, 将A1与B1格合并,并输入”报表超链接中参数加密测试”

2, 然后在A2中设置表达式:to(1,3),B2中设置表达式:”test”+A2,并为B2设置下划线

经过以上两步后报表效果如下:

1.png

3, 为报表增加参数,并且本参数是加密类要加密的对象,参数设置如下:

2.png

4, 增加B2单元格超链接,并使用自定义函数对参数加密

3.png

其中,jmClass(@testParam)是对参数testParam加密,jmClass要使用在customFunctions.properties中配置的名称,访问超链接后在地址上会显示加密后的值。

第四步:发布报表及接收参数报表的jsp设计

1, first.jsp 用于发布报表,代码如下:

<%@ page contentType=”text/html;charset=GBK” %>
<%@ taglib uri=”/WEB-INF/runqianReport4.tld” prefix=”report” %>
<html>
<body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>
<table id=”param_tbl” width=”100%” height=”100%”>
<tr><td>
<!-快逸发布报表标签–>
<report:html name=”report1″ reportFileName=”first.raq”/>
</td></tr>
</table>
</body>
</html>

2, second.jsp 接收报表参数用jsp

<%@ page contentType=”text/html;charset=GBK” %>
<%@ taglib uri=”/WEB-INF/runqianReport4.tld” prefix=”report” %>
<%@ page import=”java.io.*”%>
<%@ page import=”java.util.*”%>
<%@ page import=”com.runqian.report4.usermodel.Context”%>
<html>
<body topmargin=0 leftmargin=0 rightmargin=0 bottomMargin=0>
<%
request.setCharacterEncoding( “GBK” );
String reportFileHome=Context.getInitCtx().getMainDir();
//获取加密前testParam的值
String beforetestParam = (String)request.getParameter(”beforeTestParam”);
//获取加密后testParam的值
String testParam = (String)request.getParameter(”testParam”);
%>
<table border=”1″ borderColor=”red”>
<tr><td colspan=”2″>加密前参数testParam与加密后的结果比较</td></tr>
<tr><td>加密前的testParam:</td><td><%=beforetestParam%></td></tr>
<tr><td>加密后的testParam:</td><td><%=testParam%></td></tr>
</table>
</body>
</html>

第四步:在Web端发布报表,测试报表结果

访问first.jsp的展现结果:

4.png

点击超链接后,地址栏内信息:

5.png

通过上面接收到的参数值可以看出,未加密时看到的结果是pwd,而加密后看到的结果是根据自定义函数返回的密文,加密功能实现。

总结:由上面介绍的例子可以看出,使用快逸报表自定义函数实现超链接中参数的加密功能是很简单的,关键点还是自定义加密函数的设计,使用时只要在超链接中利用customFunctions.properties文件中设定的名称即可。本文中只做了加密的工作,解密可以在Jsp页面接收参数以后调用解密类实现。当然自定义函数还可以实现很多其他的功能来满足不同使用者不同的需求,可以在报表设计开发过程中不断尝试。

本文标签:
发布日期:2010/04/12
本文分类: 设计基础