预览报表时参数加密的一种思路

我是社区第55902位番薯,欢迎点我头像关注我哦~
首先是关键接口
  1. <extra-core>
  2.                 <RequestParameterCollector class="com.midas.plugin.encode.parameter.DecoderRegister"/>
  3.                 <WebService class="com.midas.plugin.encode.parameter.CodeService"/>
  4.         </extra-core>
复制代码
说明一下:
1.RequestParameterCollector 这个接口就是在报表计算前将参数进行一些处理,这也是我们可以做参数加密的核心接口,看代码
  1. package com.midas.plugin.encode.parameter;

  2. import java.util.List;
  3. import java.util.Map;

  4. import javax.servlet.http.HttpServletRequest;

  5. import com.fr.web.utils.DefaultRequestParameterCollector;

  6. public class DecoderRegister extends DefaultRequestParameterCollector {
  7.        
  8.         @Override
  9.         public Map<String, Object> getParametersFromSession(HttpServletRequest req) {
  10.                 Map<String, Object> map = super.getParametersFromSession(req);
  11.                 filter(map,req);
  12.                 return map;
  13.         }
  14.        
  15.         @Override
  16.         public Map<String, Object> getParametersFromAttribute(HttpServletRequest req) {
  17.                 Map<String, Object> map = super.getParametersFromAttribute(req);
  18.                 filter(map,req);
  19.                 return map;
  20.         }
  21.        
  22.         @Override
  23.         public Map<String, Object> getParametersFromReqInputStream(HttpServletRequest req) {
  24.                 Map<String, Object> map = super.getParametersFromReqInputStream(req);
  25.                 filter(map,req);
  26.                 return map;
  27.         }
  28.        
  29.         @Override
  30.         public Map<String, Object> getParametersFromParameter(HttpServletRequest req) {
  31.                 Map<String, Object> map = super.getParametersFromParameter(req);
  32.                 filter(map,req);
  33.                 return map;
  34.         }
  35.        
  36.         private void filter(Map<String, Object> map,HttpServletRequest req){
  37.                 List<String> filter = Filter.getInstance().getFilter();
  38.                 for(String panme : filter ){
  39.                         if(map.containsKey(panme)){
  40.                                 map.remove(panme);
  41.                         }
  42.                 }
  43.                 try{
  44.                         Filter.getInstance().getCoder().decode(map, req);
  45.                 }catch(Exception e){
  46.                        
  47.                 }
  48.         }
  49. }
复制代码
很明显就是在这些获取参数表的过程中对结果进行筛选,我们维护了一个list,里面是不允许直接传递值的参数,我们在列表里面直接把他删除~这样别人就没法直接传递参数过来了~
看最后有一个decode这个就是关键~我们在这个方法里面把密文传递过来的参数解析就得到明文参数了~
需要过滤的参数我们用一个xml来维护的
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <filter xmlVersion="20170715" releaseVersion="8.0.0" coder="com.midas.plugin.encode.parameter.DefaultCoder">
  3.         <parameter name="p1"/>
  4.         <parameter name="p2"/>
  5.         <parameter name="p3"/>
  6. </filter>
复制代码
这里coder指向的是一个Coder接口的实例,用来定义不同的加密和解密【这样就不会所有人都一套加解密的方案了】
parameter就是我们禁止直接传递的参数了,这个例子里面我们禁掉了3个~

然后我们看一下加密外层的部分
  1. package com.midas.plugin.encode.parameter;

  2. import java.io.PrintWriter;

  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;

  5. import com.fr.json.JSONObject;
  6. import com.fr.stable.fun.impl.NoSessionIDService;
  7. import com.fr.web.utils.WebUtils;

  8. public class CodeService extends NoSessionIDService {

  9.         @Override
  10.         public String actionOP() {
  11.                 return "pcode";
  12.         }

  13.         @Override
  14.         public void process(HttpServletRequest req, HttpServletResponse res,String op) throws Exception {
  15.                 String data = Filter.getInstance().getCoder().encode(req);
  16.                 String callback = WebUtils.getHTTPRequestParameter(req,"callback");
  17.         PrintWriter writer = WebUtils.createPrintWriter(res);
  18.         JSONObject message = JSONObject.create();
  19.         message.put("success", false);
  20.         if(data!=null){
  21.                 message.put("success", true);
  22.                 message.put("code", data);
  23.                 }
  24.         writer.print(callback+"("+message.toString()+")");
  25.         writer.flush();
  26.         writer.close();
  27.         }
  28. }
复制代码
用一个服务来直接加密的~
1.这里是因为我习惯写后台~所以用java写的~
2.因为我默认用的AES加密~所以密码不想暴露到前端

实际加解密的部分就懒得说了~就是实现Coder接口
  1. package com.midas.plugin.encode.parameter;

  2. import java.util.Map;

  3. import javax.servlet.http.HttpServletRequest;

  4. public interface Coder {
  5.         public String encode(HttpServletRequest req) throws Exception;
  6.         public void decode(Map<String,Object> parameters,HttpServletRequest req) throws Exception;
  7. }
复制代码
框架就是这样了~
实际使用是这样的~
在我们任意系统里面要通过URL直接展现报表的时候
先通过op=pcode&__code__parameters__=encodeURIComponent("p1=asd&p2=123&p3=345") ajax获取到密文
1.jpg
然后就可以通过
reportlet=xxx.cpt&__code__parameters__=encodeURIComponent(res.data) 预览报表了
3.jpg
是不是很简单~~~











发表于 2017-9-7 16:19:03
值得说明的这里之所以不加密全部的参数~原因是因为全部加密了~FR本身的内部逻辑都无法运转了~这里只能对用户参数进行加密~FR本身的参数则不能加密~
发表于 2017-9-8 08:24:29

完全看不懂
发表于 2017-9-8 09:07:25
发表于 2017-9-8 09:38:56
膜拜大神,并看不懂
发表于 2017-10-18 16:41:02
看到点金手我就进来了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

5回帖数 1关注人数 8017浏览人数
最后回复于:2017-10-25 11:10

返回顶部 返回列表