1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
| /** * web请求加解密 * <p> * 要求header: * [ * contentType: contentType支持application/json,application/x-www-form-urlencoded * isEncrypt: true/false 解密/不解密 * decryptFields: user|age|id 需要解密的字段,以|分割 * method: POST/GET 支持POST/GET * ] * * @Description * @Author xingzhi.lv * @Version 1.0 * @Date 2021/7/2 11:38 */ // TODO extends oncefilter public class WebDecryptFilter implements Filter { private static final Logger logger = LoggerFactory.getLogger(WebDecryptFilter.class); private final ObjectMapper objectMapper = new ObjectMapper(); private final static String POST = "POST"; private final static String GET = "GET"; private final static String HEADER_ENCRYPT_STATUS = "isEncrypt"; private final static String HEADER_DECRYPT_FIELDS = "encryptFields"; private final static String HEADER_DECRYPT_FIELDS_SPLIT = "|"; // 秘钥 public static final String REQUEST_SECRET = "0000000000000000";
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException { // TODO 测试文件上传有没有影响,各种请求类型有没有影响 if (!(request instanceof HttpServletRequest) || !(response instanceof HttpServletResponse)) { throw new ServletException("OncePerRequestFilter just supports HTTP requests"); } HttpServletRequest httpRequest = (HttpServletRequest) request; // 不管什么类型都转换 WebDecryptFilterRequest webDecryptFilterRequest = new WebDecryptFilterRequest(httpRequest, httpRequest.getParameterMap()); try { if (!checkDecryptCondition(webDecryptFilterRequest)) { filterChain.doFilter(webDecryptFilterRequest, response); return; } Map<String, Object> parameterMap; String contentType = webDecryptFilterRequest.getContentType(); if (contentType.contains(MediaType.APPLICATION_FORM_URLENCODED_VALUE)) { parameterMap = dealUrlencodeVlue(webDecryptFilterRequest); } else if (contentType.contains(MediaType.APPLICATION_JSON_VALUE)) { parameterMap = dealJsonVlue(webDecryptFilterRequest); } else { filterChain.doFilter(webDecryptFilterRequest, response); return; } webDecryptFilterRequest.setParameterMap(parameterMap); logger.info("前后端数据AES解密, 解密前内容:[{}]", parameterMap); parameterMap = decryptMapValues(parameterMap); logger.info("前后端数据AES解密, 解密后内容:[{}]", parameterMap); // 解密数据绑定到自定义request webDecryptFilterRequest.setParameterMap(parameterMap); filterChain.doFilter(webDecryptFilterRequest, response); } catch (Exception e) { logger.error("前后端数据AES解密, 解密异常!", e); filterChain.doFilter(webDecryptFilterRequest, response); return; } }
/** * 获取参数内容-urlencode * * @param request */ private Map<String, Object> dealUrlencodeVlue(HttpServletRequest request) { Map<String, Object> parameterMap = new LinkedHashMap<>(); for (String reqParamMapKey : request.getParameterMap().keySet()) { parameterMap.put(reqParamMapKey, request.getParameterMap().get(reqParamMapKey)[0]); } return parameterMap; }
/** * 获取参数内容-json * * @param webDecryptFilterRequest */ private Map<String, Object> dealJsonVlue(WebDecryptFilterRequest webDecryptFilterRequest) throws IOException { Map<String, Object> parameterMap = new LinkedHashMap<>(); String data = StreamUtils.copyToString(webDecryptFilterRequest.getInputStream(), StandardCharsets.UTF_8); parameterMap = objectMapper.readValue(data, parameterMap.getClass()); return parameterMap; }
/** * 解密 * * @param parameterMap * @return * @throws Exception */ private Map<String, Object> decryptMapValues(Map<String, Object> parameterMap) throws Exception { for (String paramKey : parameterMap.keySet()) { parameterMap.put(paramKey, RequestAESUtils.decryptByAes(parameterMap.get(paramKey).toString(), REQUEST_SECRET)); } return parameterMap; }
/** * 解密条件校验 * * @return false:不解密 true:解密 */ private boolean checkDecryptCondition(HttpServletRequest request) { String isEncryStr = request.getHeader(HEADER_ENCRYPT_STATUS); String decryptFieldsStr = request.getHeader(HEADER_DECRYPT_FIELDS); String[] decryptFields = {}; if (StringUtils.isNotBlank(decryptFieldsStr)) { decryptFields = decryptFieldsStr.split(HEADER_DECRYPT_FIELDS_SPLIT); } // 解密开关,解密字段列表 boolean isEncry = Boolean.parseBoolean(isEncryStr); if (!isEncry || decryptFields.length == 0) { return false; } // 请求类型 String method = request.getMethod(); if (!POST.equals(method) && !GET.equals(method)) { return false; } return true; }
@Override public void init(FilterConfig filterConfig) throws ServletException { }
@Override public void destroy() { } }
|