请求参数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);
                }
            }
        }
    }

}
View Code
/**
 * <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);
    }
View Code
/**
 * <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);
    }
}
View Code
@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;
    }
}
View Code
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();
    }

}
View Code

 

posted @ 2023-01-31 14:07  江境纣州  阅读(3)  评论(0编辑  收藏  举报