|
2 | 2 |
|
3 | 3 | import cn.huanzi.qch.baseadmin.common.pojo.ParameterRequestWrapper; |
4 | 4 | import cn.huanzi.qch.baseadmin.util.AesUtil; |
| 5 | +import cn.huanzi.qch.baseadmin.util.ErrorUtil; |
5 | 6 | import cn.huanzi.qch.baseadmin.util.RsaUtil; |
| 7 | +import cn.huanzi.qch.baseadmin.util.SysSettingUtil; |
6 | 8 | import com.fasterxml.jackson.databind.DeserializationFeature; |
7 | 9 | import com.fasterxml.jackson.databind.ObjectMapper; |
8 | 10 | import lombok.extern.slf4j.Slf4j; |
@@ -43,72 +45,82 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo |
43 | 45 | //jackson 序列化和反序列化 date处理 |
44 | 46 | mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); |
45 | 47 |
|
46 | | - //解密 |
47 | | - try { |
48 | | - //AES加密后的数据 |
49 | | - String data = request.getParameter("data"); |
50 | | - //后端RSA公钥加密后的AES的key |
51 | | - String aesKey = request.getParameter("aesKey"); |
52 | | - //前端公钥 |
53 | | - publicKey = request.getParameter("publicKey"); |
54 | | - |
55 | | - log.info("前端公钥:" + publicKey); |
56 | | - |
57 | | - //后端私钥解密的到AES的key |
58 | | - byte[] plaintext = RsaUtil.decryptByPrivateKey(Base64.decodeBase64(aesKey), RsaUtil.getPrivateKey()); |
59 | | - aesKey = new String(plaintext); |
60 | | - log.info("解密出来的AES的key:" + aesKey); |
61 | | - |
62 | | - //RSA解密出来字符串多一对双引号 |
63 | | - aesKey = aesKey.substring(1, aesKey.length() - 1); |
64 | | - |
65 | | - //AES解密得到明文data数据 |
66 | | - String decrypt = AesUtil.decrypt(data, aesKey); |
67 | | - log.info("解密出来的data数据:" + decrypt); |
68 | | - |
69 | | - //设置到方法的形参中,目前只能设置只有一个参数的情况 |
70 | | - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); |
71 | | - |
72 | | - //new一个自定义RequestWrapper |
73 | | - HashMap hashMap = mapper.readValue(decrypt, HashMap.class); |
74 | | - ParameterRequestWrapper parameterRequestWrapper = new ParameterRequestWrapper(request); |
75 | | - for (Object key : hashMap.keySet()) { |
76 | | - parameterRequestWrapper.addParameter((String) key, hashMap.get(key)); |
77 | | - } |
| 48 | + //判断api加密开关是否开启 |
| 49 | + if("Y".equals(SysSettingUtil.getSysSetting().getSysApiEncrypt())){ |
| 50 | + //解密 |
| 51 | + try { |
| 52 | + //AES加密后的数据 |
| 53 | + String data = request.getParameter("data"); |
| 54 | + //后端RSA公钥加密后的AES的key |
| 55 | + String aesKey = request.getParameter("aesKey"); |
| 56 | + //前端公钥 |
| 57 | + publicKey = request.getParameter("publicKey"); |
| 58 | + |
| 59 | + log.info("前端公钥:" + publicKey); |
| 60 | + |
| 61 | + //后端私钥解密的到AES的key |
| 62 | + byte[] plaintext = RsaUtil.decryptByPrivateKey(Base64.decodeBase64(aesKey), RsaUtil.getPrivateKey()); |
| 63 | + aesKey = new String(plaintext); |
| 64 | + log.info("解密出来的AES的key:" + aesKey); |
| 65 | + |
| 66 | + //RSA解密出来字符串多一对双引号 |
| 67 | + aesKey = aesKey.substring(1, aesKey.length() - 1); |
| 68 | + |
| 69 | + //AES解密得到明文data数据 |
| 70 | + String decrypt = AesUtil.decrypt(data, aesKey); |
| 71 | + log.info("解密出来的data数据:" + decrypt); |
| 72 | + |
| 73 | + //设置到方法的形参中,目前只能设置只有一个参数的情况 |
| 74 | + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); |
78 | 75 |
|
79 | | - servletRequest = parameterRequestWrapper; |
80 | | - request = (HttpServletRequest) servletRequest; |
81 | | - } catch (Throwable e) { |
82 | | - e.printStackTrace(); |
| 76 | + //new一个自定义RequestWrapper |
| 77 | + HashMap hashMap = mapper.readValue(decrypt, HashMap.class); |
| 78 | + ParameterRequestWrapper parameterRequestWrapper = new ParameterRequestWrapper(request); |
| 79 | + for (Object key : hashMap.keySet()) { |
| 80 | + parameterRequestWrapper.addParameter((String) key, hashMap.get(key)); |
| 81 | + } |
| 82 | + |
| 83 | + servletRequest = parameterRequestWrapper; |
| 84 | + request = (HttpServletRequest) servletRequest; |
| 85 | + } catch (Throwable e) { |
| 86 | + //输出到日志文件中 |
| 87 | + log.error(ErrorUtil.errorInfoToString(e)); |
| 88 | + } |
83 | 89 | } |
84 | 90 |
|
85 | 91 | //从session中获取生成的验证码 |
86 | 92 | String verifyCode = request.getSession().getAttribute("verifyCode").toString(); |
87 | 93 |
|
88 | 94 | if (captchaEnable && !verifyCode.toLowerCase().equals(request.getParameter("captcha").toLowerCase())) { |
89 | | - //加密 |
90 | | - try { |
| 95 | + String dataString = "{\"code\":\"400\",\"msg\":\"验证码错误\"}"; |
| 96 | + |
| 97 | + //判断api加密开关是否开启 |
| 98 | + if("Y".equals(SysSettingUtil.getSysSetting().getSysApiEncrypt())){ |
| 99 | + //加密 |
| 100 | + try { |
91 | 101 | mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); |
92 | 102 | //每次响应之前随机获取AES的key,加密data数据 |
93 | 103 | String key = AesUtil.getKey(); |
94 | 104 | log.info("AES的key:" + key); |
95 | | - String dataString = "{\"code\":\"400\",\"msg\":\"验证码错误\"}"; |
96 | 105 | log.info("需要加密的data数据:" + dataString); |
97 | 106 | String data = AesUtil.encrypt(dataString, key); |
98 | 107 |
|
99 | 108 | //用前端的公钥来解密AES的key,并转成Base64 |
100 | 109 | String aesKey = Base64.encodeBase64String(RsaUtil.encryptByPublicKey(key.getBytes(), publicKey)); |
101 | | - |
102 | | - //转json字符串并转成Object对象,设置到Result中并赋值给返回值o |
103 | | - response.setCharacterEncoding("UTF-8"); |
104 | | - response.setContentType("application/json; charset=utf-8"); |
105 | | - PrintWriter out = response.getWriter(); |
106 | | - out.print("{\"data\":{\"data\":\"" + data + "\",\"aesKey\":\"" + aesKey + "\"}}"); |
107 | | - out.flush(); |
108 | | - out.close(); |
| 110 | + dataString = "{\"data\":{\"data\":\"" + data + "\",\"aesKey\":\"" + aesKey + "\"}}"; |
109 | 111 | } catch (Throwable e) { |
110 | | - e.printStackTrace(); |
| 112 | + //输出到日志文件中 |
| 113 | + log.error(ErrorUtil.errorInfoToString(e)); |
| 114 | + } |
111 | 115 | } |
| 116 | + |
| 117 | + //转json字符串并转成Object对象,设置到Result中并赋值给返回值o |
| 118 | + response.setCharacterEncoding("UTF-8"); |
| 119 | + response.setContentType("application/json; charset=utf-8"); |
| 120 | + PrintWriter out = response.getWriter(); |
| 121 | + out.print(dataString); |
| 122 | + out.flush(); |
| 123 | + out.close(); |
112 | 124 | return; |
113 | 125 | } |
114 | 126 | } |
|
0 commit comments