springBoot过滤器去除请求参数前后空格
springBoot过滤器去除请求参数前后空格
在一个阳光明媚的早晨,客服小姐姐甜美的声音照常的响起:”昨天客户平台数千条用户充值失败,钱打到客户手中了,但是订单生成失败“
啊这…这……阳光逐渐暗淡,温馨的画面变成了黑白,甜美的声音也逐渐变的刺耳。脑子中出现了四个字【重大事故】
细细思索一番,昨天
?? 近一周都没有了新版本上线,怎么昨天出现问题???? 带着满脑子问号冲向工位
迅速走过以下操作
不信任原则
迅速验证消息的真实性(消息属实)- 查错误数据,查看数据范围,评定事故等级(还好:51条失败订单)
- 回复客服以及上级,说明事情已经开始处理
- 根据上面出错数据查询日志,定位问题
- 经过比对用户更改了微信参数【前面多打一个空格】
- 微信回调参数与数据库中保存进行比对【多一个空格必定比对不成功】
- 结局就是,回调失败,订单生成失败
- 立刻联系客户修复错误参数(保证不再扩大事故范围)
- 立即着手修复错误数据,保证平台运行
- 随后进行程序优化【即增加过滤器去除请求参数前后空格】
是时候站起来喝杯茶,客户很好说话,没有问责,没有争吵。看看窗外的天,乌云散去,阳光逐渐洒满大地,依旧是温馨和谐的日常~
随后,附上代码
每个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过滤器去除请求参数前后空格相关推荐
- 通过filter过滤器对请求参数进行处理
遇见的问题: 前台把参数通过报文或者使用表单.ajax提交到后台,如果我们的请求参数是加密的,那么我们在controller里面的每一个方法里都需要进行解密处理.如果方法太多,那就太麻烦了. 设计方案 ...
- SpringBoot - 获取Get请求参数详解
利用 Spring Boot 来制作 Web 应用,就必定会涉及到前端与后台之间互相传递参数.下面演示 Controller 如何接收以 GET 方式传递过来的参数. 一.直接在请求路径中 (1).假 ...
- SpringMVC表单请求参数的绑定,配置编码过滤器解决请求参数中文乱码问题,自定义类型转换器
文章目录 SpringMVC的参数绑定支持的数据类型 基本数据类型和字符串类型 JavaBean 包装类 Map类型 List类型 POST请求参数中文乱码的解决方法 自定义类型转换器(Date类 ...
- SpringBoot - 获取Get请求参数详解(附样例:非空、默认值、数组、对象)
利用 Spring Boot 来制作 Web 应用,就必定会涉及到前端与后台之间互相传递参数.下面演示 Controller 如何接收以 GET 方式传递过来的参数. 一.参数直接在路径中 (1)假设 ...
- SpringBoot 获取 Get 请求参数详解
叙述 利用 Spring Boot 来制作 Web 应用,就必定会涉及到前端与后台之间互相传递参数. 下面演示 Controller 如何接收以 GET 方式传递过来的参数. 解决方案 参数直接在路径 ...
- springboot获取URL请求参数的几种方法
原文地址:http://www.cnblogs.com/xiaoxi/p/5695783.html 1.直接把表单的参数写在Controller相应的方法的形参中,适用于get方式提交,不适用于pos ...
- springboot 处理put请求参数
put请求参数理论上是在请求的body中(json传输),但是使用如下方式不能得到: @RequestParam Integer meetingId,@RequestParam Boolean pas ...
- Spring MVC在参数绑定前通过Filter过滤器改变请求参数的值
第一步,对request请求进行增强: /*** author: zhangxueliang* date: 2019-08-23*/ public class ParameterServletRequ ...
- SpringBoot关于@RequestBody请求参数
一.Post请求中Dto参数带@RequestBody 方法代码: @PostMapping("/test")public UserDto getUserParam(@Reques ...
- SpringBoot的GET请求参数包含[]等特殊符号,返回400状态码
今天系统2.1版本上线时,忽然发现一个问题,通知公告模块中的一个文件不能下载了,而其他的是可以的,经过仔细的排查发现,是由于文件名中包含了英文的[],问题如下图: 原因分析 Tomcat的新版本中增加 ...
最新文章
- Unity 单元测试(PLUnitTest工具)
- python subprocess 模块
- Mybatis 入门之resultMap与resultType讲解实例
- 编程三角形面积公式_利用边长计算三角形面积 — 海伦公式推导
- 设计素材PSD分层模板|美食类海报设计技法
- 理解分布式和集群的区别
- mysql 复制表结构和表数据
- 深度学习TF—11.Auto-Encoders自编码器
- iPhone发展【一】从HelloWorld开始
- 基于jsp+servlet的 新闻管理系统。
- 高等代数——大学高等代数课程创新教材(丘维声)——3.4笔记+习题
- kernel/Makefile:971: recipe for target ‘prepare3‘ failed
- Pyramidal RoR for Image Classification
- 互联网金融常见的一些业务
- 截图工具当前未在计算机上运行 请重启_一个顶十个的工具箱软件,这才是真正的装机必备。...
- python真的好学吗?
- PgAdmin3 F7
- 工程师笔记|UPS启动期间,VxRail的这招也许能救命
- 【UOJ 216】最小花费最短路
- 二十八. geotrellis使用 栅格数据色彩渲染(多波段真彩色)
热门文章
- Winform打包-NSIS 检测.NetFramework版本(亲测可用)
- FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=AGENT_ERROR_TRANSPORT_INIT(
- matlab中的tall,tall 数组
- MATLAB Simulink
- MathWorks 中国
- 游戏筑基开发之动态数组(C语言)
- Security+ 学习笔记12 安全编码实践
- NYOJ--458 小光棍数
- Centos7快速安装docker
- JavaScript (十九):DOM对象其它操作
- Mongoose的增删改查
- IoT实时数据可视化方案(进阶版):Worldmap Panel使用详解及使用Node-RED进行流程管理...