请求参数Trim
参考https://blog.csdn.net/Curtisjia/article/details/122149507
/** * <p> * json字符串首尾去空格 * </p> * * @author dingjm * @since 2023/1/13 */ public class StringJsonUtils { /** * json字符串首尾去空格 * * @param jsonStr json字符串 * @return 去掉首尾空格的json */ public static JSONObject JsonStrTrim(String jsonStr) { JSONObject reagobj = JSONObject.parseObject(jsonStr); Set<String> keySet = reagobj.keySet(); Iterator<String> itt = keySet.iterator(); while (itt.hasNext()) { String key = itt.next(); Object obj = reagobj.get(key); if (obj instanceof JSONObject) { Set<String> keySets = ((JSONObject) obj).keySet(); Iterator<String> iterator = keySets.iterator(); while (iterator.hasNext()) { String key1 = iterator.next(); Object o = ((JSONObject) obj).get(key1); if (o instanceof String) { if (o == null) { continue; } else if ("".equals(o.toString().trim())) { continue; } else { ((JSONObject) obj).put(key1, o.toString().trim()); } } } reagobj.put(key, obj); } else if (obj instanceof JSONArray) { for (int i = 0; i < ((JSONArray) obj).size(); i++) { Object o = ((JSONArray) obj).get(i); if (o instanceof JSONObject) { Set<String> keySets = ((JSONObject) o).keySet(); Iterator<String> iterator = keySets.iterator(); while (iterator.hasNext()) { String key1 = iterator.next(); Object o1 = ((JSONObject) o).get(key1); if (o1 instanceof String) { if (o1 == null) { continue; } else if ("".equals(o1.toString().trim())) { continue; } else { ((JSONObject) o).put(key1, o1.toString().trim()); } } } } else if (o instanceof String) { if (o == null) { continue; } else if ("".equals(o.toString().trim())) { continue; } else { ((JSONArray) obj).set(i, ((String) o).trim()); } } } reagobj.put(key, obj); } else if (obj instanceof String) { if (obj == null) { continue; } else if ("".equals(obj.toString().trim())) { continue; } else { reagobj.put(key, obj.toString().trim()); } } } return reagobj; } public static Object jsonStringToMap(String jsonString) { Map<String, Object> map = new HashMap<>(); Object obj1 = JSONObject.parse(jsonString); if (obj1 instanceof JSONArray) { List<Map<String, Object>> list = new ArrayList<>(); JSONArray obj11 = (JSONArray) obj1; for (Object o11 : obj11) { Map<String, Object> map1 = new HashMap<>(); recursionTrim(map1, (JSONObject) o11); list.add(map1); } return list; } if (obj1 instanceof JSONObject) { recursionTrim(map, (JSONObject) obj1); } return map; } private static void recursionTrim(Map<String, Object> map, JSONObject o11) { for (String k : o11.keySet()) { Object o = o11.get(k); if (o instanceof JSONArray) { List<Object> list = new ArrayList<>(); for (Object obj : (JSONArray) o) { if (obj instanceof JSONObject) { list.add(jsonStringToMap(obj.toString())); } else if (obj instanceof String) { list.add(obj.toString().trim()); } else { list.add(obj); } } map.put(k, list); } else if (o instanceof JSONObject) { map.put(k, jsonStringToMap(o.toString())); } else { if (o instanceof String) { map.put(k, o.toString().trim()); } else { map.put(k, o); } } } } }
/** * <p> * 自定义TrimRequestWrapper类 * </p> * * @author dingjm * @since 2023/1/13 */ @Slf4j public class TrimRequestWrapper extends HttpServletRequestWrapper { /** * 保存处理后的参数 */ private Map<String, String[]> params = new HashMap<String, String[]>(); public TrimRequestWrapper(HttpServletRequest request) { //将request交给父类,以便于调用对应方法的时候,将其输出 super(request); //对于非json请求的参数进行处理 if (super.getHeader(HttpHeaders.CONTENT_TYPE) == null || (!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE) && !super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_UTF8_VALUE))) { setParams(request); } } private void setParams(HttpServletRequest request) { //将请求的的参数转换为map集合 Map<String, String[]> requestMap = request.getParameterMap(); this.params.putAll(requestMap); //去空操作 this.modifyParameterValues(); } /** * 将parameter的值去除空格后重写回去 */ public void modifyParameterValues() { Set<String> set = params.keySet(); Iterator<String> it = set.iterator(); while (it.hasNext()) { String key = it.next(); String[] values = params.get(key); values[0] = values[0].trim(); params.put(key, values); } } /** * 重写getParameter 参数从当前类中的map获取 */ @Override public String getParameter(String name) { String[] values = params.get(name); if (values == null || values.length == 0) { return null; } return values[0]; } /** * 重写getParameterValues */ @Override public String[] getParameterValues(String name) { return params.get(name); } /** * 重写getInputStream方法 post类型的请求参数必须通过流才能获取到值 * 这种获取的参数的方式针对于内容类型为文本类型,比如Content-Type:text/plain,application/json,text/html等 * 在springmvc中可以使用@RequestBody 来获取 json数据类型 * 其他文本类型不做处理,重点处理json数据格式 * getInputStream() ,只有当方法为post请求,且参数为json格式是,会被默认调用 */ @Override public ServletInputStream getInputStream() throws IOException { // if (!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE) && !super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_UTF8_VALUE)) { //如果参数不是json格式则直接返回 return super.getInputStream(); } //为空,直接返回 String json = IOUtils.toString(super.getInputStream(), "utf-8"); if (StringUtils.isEmpty(json)) { return super.getInputStream(); } //json字符串首尾去空格 Object jsonObject = StringJsonUtils.jsonStringToMap(json); // ByteArrayInputStream bis = new ByteArrayInputStream(jsonObject.toJSONString().getBytes("utf-8")); ByteArrayInputStream bis = new ByteArrayInputStream( JSON.toJSONString(jsonObject, SerializerFeature.DisableCircularReferenceDetect) .getBytes(StandardCharsets.UTF_8)); return new MyServletInputStream(bis); }
/** * <p> * * </p> * * @author dingjm * @since 2023/1/13 */ public class TrimFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { //自定义TrimRequestWrapper,在这里实现参数去空 TrimRequestWrapper requestWrapper = new TrimRequestWrapper(httpServletRequest); filterChain.doFilter(requestWrapper, httpServletResponse); } }
@Configuration public class FilterConfig { /** * 注册去除参数头尾空格过滤器 */ @Bean public FilterRegistrationBean trimFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setDispatcherTypes(DispatcherType.REQUEST); //注册自定义过滤器 registration.setFilter(new TrimFilter()); //过滤所有路径 registration.addUrlPatterns("/*"); //过滤器名称 registration.setName("trimFilter"); //优先级越低越优先,这里说明最低优先级 registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); return registration; } }
public class MyServletInputStream extends ServletInputStream { private ByteArrayInputStream bis; public MyServletInputStream(ByteArrayInputStream bis) { this.bis = bis; } @Override public boolean isFinished() { return true; } @Override public boolean isReady() { return true; } @Override public void setReadListener(ReadListener listener) { } @Override public int read() throws IOException { return bis.read(); } }