报表钻取链接中对参数加密

润乾本身自带的参数模板会将参数统一放到参数池中,通过 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)

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

http://localhost:6001/demo/reportJsp/showReport.jsp?raq=demo.raq&arg=MTA1MzE=

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

如,图片一

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

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

图片 1.png(29.58 KB, 下载次数: 0)

参数值处理

![参数值处理]
(http://bbs.raqsoft.com.cn/data/attachment/forum/201605/24/093338n4ruaaa2hua5oxl2.png)

更多超链接相关问题请查看:前端效果相关问题分类导航