润乾报表V4超链接中对参数进行加密解密

众所周知,润乾本身自带的参数模板会将参数统一放到参数池中,通过url传递参数池ID来进行参数传递,而不是直接将参数直接暴露在地址栏中。可是在报表中的超链接功能,我们通常是将拼好的url写上进行报表的钻取,这时会发现钻取中的url是全部展现在外面的,如何对这个url进行安全处理呢?

Java本身带有这encode和decode的功能,而且超链接中的url又可以写润乾的表达式,所以可以通过自定义函数来进行实现。

首先实现两个自定义函数的实现类MyEncode()和MyDecode()

这两个类大部分代码相同,都是正常流程获取参数-取出表达式-计算表达式-判断是否为空、类型等:

// 判断参数个数

if (this.paramList.size() < 1) {

MessageManager mm = EngineMessage.get();

throw new ReportError("encrypt:"

+ mm.getMessage("function.missingParam"));

}

// 取得第一个参数,默认为表达式,需要把该表达式算出来,结果才是函数的参数值

Expression param1 = (Expression) this.paramList.get(0);

if (param1 == null) { // 判断参数是否为空

MessageManager mm = EngineMessage.get();

throw new ReportError("encrypt:"

+ mm.getMessage("function.invalidParam"));

}

// 算出第一个参数值

Object result1 = Variant2.getValue(param1.calculate(ctx, isInput),

false, isInput);

// 判断第一个参数值是否为空

if (result1 == null) {

return null;

}

if (!(result1 instanceof String)) {

MessageManager mm = EngineMessage.get();

throw new ReportError("encrypt:"

+ mm.getMessage("function.paramTypeError"));

}

在MyEncode类中,我们需要对算出来的参数值进行加密处理:

BASE64Encoder base64 = new BASE64Encoder();

String value = base64.encode(result1.toString().getBytes());

而在DeEncode类中,需要对加密后的参数进行解密处理:

BASE64Decoder base64 = new BASE64Decoder();

String value = null;

try {

value = new String(base64.decodeBuffer(result1.toString()));

} catch (IOException e) {

e.printStackTrace();

}

然后进行自定义函数注册,修改customFunctions.properties:

decode=0,com.runqian.MyDecode

encode=0,com.runqian.MyEncode

最后我们设计一张带有钻取功能的报表,通过自定义函数对参数进行加解密处理,如下:

在A2单元格增加超链接表达式:

"reportJsp/showReport.jsp?raq=demo.raq&arg="+encode(A2)

页面中我们可以看到需要传递的参数已经被加密过了。

 

然后在钻取的表中增加arg参数,再添加动态参数decode(arg)当成过滤条件。

 

这样就可以做到了url的参数加密。

同样这个方法也可以用于多个参数传递,将需要的多参数一起拼成arg进行encode加密,然后再通过动态参数进行decode解密,将参数串拆分成各个参数使用。

你可能感兴趣的:(报表应用)