潤乾報表V4超連結中對引數進行加密解密
眾所周知,潤乾本身自帶的引數模板會將引數統一放到引數池中,通過url傳遞引數池ID來進行引數傳遞,而不是直接將引數直接暴露在位址列中。可是在報表中的超連結功能,我們通常是將拼好的url寫上進行報表的鑽取,這時會發現鑽取中的url是全部展現在外面的,如何對這個url進行安全處理呢?
Java本身帶有這encode和decode的功能,而且超連結中的url又可以寫潤乾的表示式,所以可以通過自定義函式來進行實現。
首先實現兩個自定義函式的實現類MyEncode()和MyDecode()
這兩個類大部分程式碼相同,都是正常流程獲取引數-取出表示式-計算表示式-判斷是否為空、型別等:
// 判斷引數個數
if
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解密,將引數串拆分成各個引數使用。