1. 程式人生 > >潤乾報表V4超連結中對引數進行加密解密

潤乾報表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解密,將引數串拆分成各個引數使用。