首先是关键接口
- <extra-core>
- <RequestParameterCollector class="com.midas.plugin.encode.parameter.DecoderRegister"/>
- <WebService class="com.midas.plugin.encode.parameter.CodeService"/>
- </extra-core>
复制代码 说明一下:
1.RequestParameterCollector 这个接口就是在报表计算前将参数进行一些处理,这也是我们可以做参数加密的核心接口,看代码
- package com.midas.plugin.encode.parameter;
- import java.util.List;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- import com.fr.web.utils.DefaultRequestParameterCollector;
- public class DecoderRegister extends DefaultRequestParameterCollector {
-
- @Override
- public Map<String, Object> getParametersFromSession(HttpServletRequest req) {
- Map<String, Object> map = super.getParametersFromSession(req);
- filter(map,req);
- return map;
- }
-
- @Override
- public Map<String, Object> getParametersFromAttribute(HttpServletRequest req) {
- Map<String, Object> map = super.getParametersFromAttribute(req);
- filter(map,req);
- return map;
- }
-
- @Override
- public Map<String, Object> getParametersFromReqInputStream(HttpServletRequest req) {
- Map<String, Object> map = super.getParametersFromReqInputStream(req);
- filter(map,req);
- return map;
- }
-
- @Override
- public Map<String, Object> getParametersFromParameter(HttpServletRequest req) {
- Map<String, Object> map = super.getParametersFromParameter(req);
- filter(map,req);
- return map;
- }
-
- private void filter(Map<String, Object> map,HttpServletRequest req){
- List<String> filter = Filter.getInstance().getFilter();
- for(String panme : filter ){
- if(map.containsKey(panme)){
- map.remove(panme);
- }
- }
- try{
- Filter.getInstance().getCoder().decode(map, req);
- }catch(Exception e){
-
- }
- }
- }
复制代码 很明显就是在这些获取参数表的过程中对结果进行筛选,我们维护了一个list,里面是不允许直接传递值的参数,我们在列表里面直接把他删除~这样别人就没法直接传递参数过来了~
看最后有一个decode这个就是关键~我们在这个方法里面把密文传递过来的参数解析就得到明文参数了~
需要过滤的参数我们用一个xml来维护的
- <?xml version="1.0" encoding="UTF-8"?>
- <filter xmlVersion="20170715" releaseVersion="8.0.0" coder="com.midas.plugin.encode.parameter.DefaultCoder">
- <parameter name="p1"/>
- <parameter name="p2"/>
- <parameter name="p3"/>
- </filter>
复制代码 这里coder指向的是一个Coder接口的实例,用来定义不同的加密和解密【这样就不会所有人都一套加解密的方案了】
parameter就是我们禁止直接传递的参数了,这个例子里面我们禁掉了3个~
然后我们看一下加密外层的部分
- package com.midas.plugin.encode.parameter;
- import java.io.PrintWriter;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.fr.json.JSONObject;
- import com.fr.stable.fun.impl.NoSessionIDService;
- import com.fr.web.utils.WebUtils;
- public class CodeService extends NoSessionIDService {
- @Override
- public String actionOP() {
- return "pcode";
- }
- @Override
- public void process(HttpServletRequest req, HttpServletResponse res,String op) throws Exception {
- String data = Filter.getInstance().getCoder().encode(req);
- String callback = WebUtils.getHTTPRequestParameter(req,"callback");
- PrintWriter writer = WebUtils.createPrintWriter(res);
- JSONObject message = JSONObject.create();
- message.put("success", false);
- if(data!=null){
- message.put("success", true);
- message.put("code", data);
- }
- writer.print(callback+"("+message.toString()+")");
- writer.flush();
- writer.close();
- }
- }
复制代码 用一个服务来直接加密的~
1.这里是因为我习惯写后台~所以用java写的~
2.因为我默认用的AES加密~所以密码不想暴露到前端
实际加解密的部分就懒得说了~就是实现Coder接口
- package com.midas.plugin.encode.parameter;
- import java.util.Map;
- import javax.servlet.http.HttpServletRequest;
- public interface Coder {
- public String encode(HttpServletRequest req) throws Exception;
- public void decode(Map<String,Object> parameters,HttpServletRequest req) throws Exception;
- }
复制代码 框架就是这样了~
实际使用是这样的~
在我们任意系统里面要通过URL直接展现报表的时候
先通过op=pcode&__code__parameters__=encodeURIComponent("p1=asd&p2=123&p3=345") ajax获取到密文
然后就可以通过
reportlet=xxx.cpt&__code__parameters__=encodeURIComponent(res.data) 预览报表了
是不是很简单~~~
|