springBoot过滤器去除请求参数前后空格

在一个阳光明媚的早晨,客服小姐姐甜美的声音照常的响起:”昨天客户平台数千条用户充值失败,钱打到客户手中了,但是订单生成失败“

啊这…这……阳光逐渐暗淡,温馨的画面变成了黑白,甜美的声音也逐渐变的刺耳。脑子中出现了四个字【重大事故】

细细思索一番,昨天?? 近一周都没有了新版本上线,怎么昨天出现问题???? 带着满脑子问号冲向工位

迅速走过以下操作
  1. 不信任原则 迅速验证消息的真实性(消息属实)
  2. 查错误数据,查看数据范围,评定事故等级(还好:51条失败订单)
  3. 回复客服以及上级,说明事情已经开始处理
  4. 根据上面出错数据查询日志,定位问题
    1. 经过比对用户更改了微信参数【前面多打一个空格】
    2. 微信回调参数与数据库中保存进行比对【多一个空格必定比对不成功】
    3. 结局就是,回调失败,订单生成失败
  5. 立刻联系客户修复错误参数(保证不再扩大事故范围)
  6. 立即着手修复错误数据,保证平台运行
  7. 随后进行程序优化【即增加过滤器去除请求参数前后空格】
是时候站起来喝杯茶,客户很好说话,没有问责,没有争吵。看看窗外的天,乌云散去,阳光逐渐洒满大地,依旧是温馨和谐的日常~

随后,附上代码

每个SpringBoot项目增加过滤器(对外提供API的模块,web网站模块,微信小程序模块。。。)

import com.zy.common.xss.TrimFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {/*** 去除参数头尾空格过滤器** @return*/@Beanpublic FilterRegistrationBean trimFilter() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setDispatcherTypes(DispatcherType.REQUEST);registration.setFilter(new TrimFilter());registration.addUrlPatterns("/*");registration.setName("TrimFilter");registration.setOrder(Integer.MAX_VALUE - 1);return registration;}
}

common(公共组件)中增加过滤器

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;public class TrimFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {filterChain.doFilter(new TrimHttpServletRequestWrapper((HttpServletRequest) servletRequest), servletResponse);}@Overridepublic void destroy() {}
}
import com.zy.common.utils.JsonTrimUtils;
import org.apache.commons.io.IOUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.StringUtils;import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;public class TrimHttpServletRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper {private Map<String , String[]> params = new HashMap<>();public TrimHttpServletRequestWrapper(HttpServletRequest request) {// 将request交给父类,以便于调用对应方法的时候,将其输出,其实父亲类的实现方式和第一种new的方式类似super(request);//将参数表,赋予给当前的Map以便于持有request中的参数this.params.putAll(request.getParameterMap());this.modifyParameterValues();}/*** 重写getInputStream方法  post类型的请求参数必须通过流才能获取到值*/@Overridepublic ServletInputStream getInputStream() throws IOException {//非json类型,直接返回if(!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)){return super.getInputStream();}//为空,直接返回String json = IOUtils.toString(super.getInputStream(), "utf-8");if (!StringUtils.hasLength(json)) {return super.getInputStream();}ByteArrayInputStream bis = new ByteArrayInputStream(JsonTrimUtils.jsonTrim(json).getBytes("utf-8"));return new MyServletInputStream(bis);}/*** 将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);for (int i = 0; i < values.length; i++) {values[i] = values[i].trim();}params.put(key, values);}}/*** 重写getParameter 参数从当前类中的map获取*/@Overridepublic String getParameter(String name) {String[]values = params.get(name);if(values == null || values.length == 0) {return null;}return values[0];}/*** 重写getParameterValues*/@Overridepublic String[] getParameterValues(String name) {//同上return params.get(name);}class MyServletInputStream extends  ServletInputStream{private ByteArrayInputStream bis;public MyServletInputStream(ByteArrayInputStream bis){this.bis=bis;}@Overridepublic boolean isFinished() {return true;}@Overridepublic boolean isReady() {return true;}@Overridepublic void setReadListener(ReadListener listener) {}@Overridepublic int read() {return bis.read();}}}

工具类,去除JSON中值前后空格

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;import java.util.Iterator;
import java.util.Map;/*** json工具类* @Version 1.0*/
public final class JsonTrimUtils {/*** 构造器*/private JsonTrimUtils() {}/*** 去除json值前后空格* @param jsonStr jsonStr* @return*/public static JSONObject jsonTrim(String jsonStr) {return jsonTrim(JSONObject.parseObject(jsonStr));}/*** 去除value的空格** @param jsonObject jsonObject* @return*/public static JSONObject jsonTrim(JSONObject jsonObject) {Iterator<Map.Entry<String, Object>> iterator = jsonObject.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<String, Object> next = iterator.next();Object value = next.getValue();if (value != null) {if (value instanceof String) {//清空值前后空格jsonObject.put(next.getKey(), ((String) value).trim());} else if (value instanceof JSONObject) {jsonTrim((JSONObject) value);} else if (value instanceof JSONArray) {jsonTrimArray((JSONArray) value);}}}return jsonObject;}/*** 清空JSONArray 值前后空格* @param array*/private static void jsonTrimArray(JSONArray array) {if (array.size() > 0) {for (int i = 0; i < array.size(); i++) {Object object = array.get(i);if (object != null) {if (object instanceof String) {array.set(i, ((String) object).trim());} else if (object instanceof JSONObject) {jsonTrim((JSONObject) object);} else if (object instanceof JSONArray) {jsonTrimArray((JSONArray) object);}}}}}
}

JSON 的支持使用的JAR

<!-- Json解析 -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.69_sec11</version>
</dependency>

在此就全部搞定了,有需要的复制即可使用,有用就关注一下吧

springBoot过滤器去除请求参数前后空格相关推荐

  1. 通过filter过滤器对请求参数进行处理

    遇见的问题: 前台把参数通过报文或者使用表单.ajax提交到后台,如果我们的请求参数是加密的,那么我们在controller里面的每一个方法里都需要进行解密处理.如果方法太多,那就太麻烦了. 设计方案 ...

  2. SpringBoot - 获取Get请求参数详解

    利用 Spring Boot 来制作 Web 应用,就必定会涉及到前端与后台之间互相传递参数.下面演示 Controller 如何接收以 GET 方式传递过来的参数. 一.直接在请求路径中 (1).假 ...

  3. ​ SpringMVC表单请求参数的绑定,配置编码过滤器解决请求参数中文乱码问题,自定义类型转换器

    文章目录 ​ SpringMVC的参数绑定支持的数据类型 基本数据类型和字符串类型 JavaBean 包装类 Map类型 List类型 POST请求参数中文乱码的解决方法 自定义类型转换器(Date类 ...

  4. SpringBoot - 获取Get请求参数详解(附样例:非空、默认值、数组、对象)

    利用 Spring Boot 来制作 Web 应用,就必定会涉及到前端与后台之间互相传递参数.下面演示 Controller 如何接收以 GET 方式传递过来的参数. 一.参数直接在路径中 (1)假设 ...

  5. SpringBoot 获取 Get 请求参数详解

    叙述 利用 Spring Boot 来制作 Web 应用,就必定会涉及到前端与后台之间互相传递参数. 下面演示 Controller 如何接收以 GET 方式传递过来的参数. 解决方案 参数直接在路径 ...

  6. springboot获取URL请求参数的几种方法

    原文地址:http://www.cnblogs.com/xiaoxi/p/5695783.html 1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于pos ...

  7. springboot 处理put请求参数

    put请求参数理论上是在请求的body中(json传输),但是使用如下方式不能得到: @RequestParam Integer meetingId,@RequestParam Boolean pas ...

  8. Spring MVC在参数绑定前通过Filter过滤器改变请求参数的值

    第一步,对request请求进行增强: /*** author: zhangxueliang* date: 2019-08-23*/ public class ParameterServletRequ ...

  9. SpringBoot关于@RequestBody请求参数

    一.Post请求中Dto参数带@RequestBody 方法代码: @PostMapping("/test")public UserDto getUserParam(@Reques ...

  10. SpringBoot的GET请求参数包含[]等特殊符号,返回400状态码

    今天系统2.1版本上线时,忽然发现一个问题,通知公告模块中的一个文件不能下载了,而其他的是可以的,经过仔细的排查发现,是由于文件名中包含了英文的[],问题如下图: 原因分析 Tomcat的新版本中增加 ...

最新文章

  1. Unity 单元测试(PLUnitTest工具)
  2. python subprocess 模块
  3. Mybatis 入门之resultMap与resultType讲解实例
  4. 编程三角形面积公式_利用边长计算三角形面积 — 海伦公式推导
  5. 设计素材PSD分层模板|美食类海报设计技法
  6. 理解分布式和集群的区别
  7. mysql 复制表结构和表数据
  8. 深度学习TF—11.Auto-Encoders自编码器
  9. iPhone发展【一】从HelloWorld开始
  10. 基于jsp+servlet的 新闻管理系统。
  11. 高等代数——大学高等代数课程创新教材(丘维声)——3.4笔记+习题
  12. kernel/Makefile:971: recipe for target ‘prepare3‘ failed
  13. Pyramidal RoR for Image Classification
  14. 互联网金融常见的一些业务
  15. 截图工具当前未在计算机上运行 请重启_一个顶十个的工具箱软件,这才是真正的装机必备。...
  16. python真的好学吗?
  17. PgAdmin3 F7
  18. 工程师笔记|UPS启动期间,VxRail的这招也许能救命
  19. 【UOJ 216】最小花费最短路
  20. 二十八. geotrellis使用 栅格数据色彩渲染(多波段真彩色)

热门文章

  1. Winform打包-NSIS 检测.NetFramework版本(亲测可用)
  2. FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(
  3. matlab中的tall,tall 数组 - MATLAB Simulink - MathWorks 中国
  4. 游戏筑基开发之动态数组(C语言)
  5. Security+ 学习笔记12 安全编码实践
  6. NYOJ--458 小光棍数
  7. Centos7快速安装docker
  8. JavaScript (十九):DOM对象其它操作
  9. Mongoose的增删改查
  10. IoT实时数据可视化方案(进阶版):Worldmap Panel使用详解及使用Node-RED进行流程管理...