前端传值时可能将参数值前后带了空格,这些空格可能引发一些异常,如:equals 两个值应该是true的,但因为有了前后空格的原因出现false,对用户来说是不可接受的。

基于以上场景这里使用 Filter 去掉参数值的前后空格

1. 配置过滤器

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

2. 新建参数过滤器

RequestTrimHttpServletRequestWrapper 请求参数包装器

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;/*** 请求参数过滤器*/
public class RequestTrimFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {filterChain.doFilter(new RequestTrimHttpServletRequestWrapper((HttpServletRequest) servletRequest), servletResponse);}}

3. 参数 trim 处理

import com.alibaba.fastjson.JSONObject;
import com.example.demo.utils.JsonUtils;
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 javax.servlet.http.HttpServletRequestWrapper;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;/*** 请求参数trim处理*/
public class RequestTrimHttpServletRequestWrapper extends HttpServletRequestWrapper {private static final String CHARSET = "utf-8";private Map<String , String[]> params = new HashMap<>();public RequestTrimHttpServletRequestWrapper(HttpServletRequest request) {//将request交给父类,调用对应方法的时候,将其输出super(request);//持有request中的参数this.params.putAll(request.getParameterMap());this.modifyParameterValues();}/*** post类型的请求参数必须通过流才能获取到值*/@Overridepublic ServletInputStream getInputStream() throws IOException {//非json类型,直接返回if(!MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(super.getHeader(HttpHeaders.CONTENT_TYPE))){return super.getInputStream();}//为空,直接返回String json = IOUtils.toString(super.getInputStream(), CHARSET);if (!StringUtils.hasLength(json)) {return super.getInputStream();}JSONObject jsonObject = JsonUtils.jsonTrim(json);byte[] bytes = jsonObject.toJSONString().getBytes(CHARSET);ByteArrayInputStream bis = new ByteArrayInputStream(bytes);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);}}/*** 从当前类中map获取参数*/@Overridepublic String getParameter(String name) {String[] values = params.get(name);if(values == null || values.length == 0) {return null;}return values[0];}@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();}}}

4. JSON 去空格工具类

/*** json trim工具类*/
public class JsonUtils {private JsonUtils() {}/*** 去除json值前后空格* @param jsonStr* @return*/public static JSONObject jsonTrim(String jsonStr) {return jsonTrim(JSONObject.parseObject(jsonStr));}/*** 去除value的空格* @param 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);}}}}}}

SpringBoot 参数 trim 处理相关推荐

  1. SpringBoot 参数符号转义,用这个包下面的类

    SpringBoot 参数符号转义,用这个包下面的类 org.apache.commons.text.StringEscapeUtils String team = StringEscapeUtils ...

  2. Springboot 参数校验@Valid @Validated(最新最全)

    Springboot 参数校验@Valid @Validated(最新最全) 提示:统一参数校验,异常处理 文章目录 Springboot 参数校验@Valid @Validated(最新最全) 前言 ...

  3. springboot参数校验,对象的某属性校验

    对于前端来的数据,后端难免要进行合法性校验,这里可以采用springboot自带的Validated注解来实现,详细方法如下: 实体类: public class User implements Se ...

  4. springboot 参数校验详解

    https://www.jianshu.com/p/89a675b7c900 在日常开发写rest接口时,接口参数校验这一部分是必须的,但是如果全部用代码去做,显得十分麻烦,spring也提供了这部分 ...

  5. 补习系列(4)-springboot 参数校验详解

    目录 目标 一.PathVariable 校验 二.方法参数校验 三.表单对象校验 四.RequestBody 校验 五.自定义校验规则 六.异常拦截器 参考文档 目标 对于几种常见的入参方式,了解如 ...

  6. SpringBoot参数校验

    使用传统方式的弊端 public String addUser(User user) {if (user == null || user.getId() == null || user.getAcco ...

  7. springboot参数校验validation

    文章目录 1. 引入 2. 基本使用 2.1 引入依赖 2.2 基本使用 2.3 注解介绍 2.4 返回值完善 2.5 统一异常处理 2.6 @Valid和@Validate注解 3. 分组校验 4. ...

  8. SpringBoot参数校验--List类型

        我们在写后台接口的时候,通常会定义DTO来接收参数,在DTO中使用注解书写验证的规则:然后在Controller层使用@validated注解来验证自己制定的校验规则.但当我们的接口接收的参数 ...

  9. springboot 参数校验

    1.场景 1)参数为实体类 web层需要对前端传输的数据做校验,如果按照下面的代码写,就太浪费时间了,并且代码看起来很乱. public AjaxResult queryUserProjectCont ...

最新文章

  1. linux arch 软件管理工具 pacman 简介
  2. 玩转Numpy——np.ravel()的使用
  3. DispatcherServlet的用途
  4. 雷蛇用户计算机不满足系统要求,我的RazerBook13已经升级Windows11了
  5. 机械革命bios升级_机械革命X3-S评测:感受来自i7-10875H和RTX2060的怒吼
  6. win7电脑便签怎么弄
  7. 谷歌octotree插件的使用
  8. php进销存源码系统开发
  9. 小心!使用网页版的WhatsApp时,请选择隐私模式
  10. 15000cd是多少流明_将lm换算为cd·sr (流明换算为cd·sr)
  11. 2022年初级会计职称考试会计实务练习题及答案
  12. 点餐小程序实战教程03-店铺信息展示
  13. 【STM32 HAL库+STM32CUBEMX】使用usart1打印串口数据
  14. word论文格式管理和孤行控制
  15. Linux系统/etc/fstab文件损坏如何处理
  16. x-window简介
  17. 【干货收藏】测试人员必看的经典书籍
  18. 基于ZigBee定位技术下的室内人员定位-室内定位-新导智能
  19. 关于敬语的整理(约截止到N2阶段)
  20. “互联网女皇”发趋势报告:移动互联网仍处起步

热门文章

  1. 12333提交显示服务器异常,ORA-03137: TTC protocol internal error : [12333]错误一例
  2. 横扫千军安卓系统有什么服务器,横扫千军手游无法连接服务器怎么办 处理方法一览...
  3. 火云开发课堂 - 《使用Cocos2d-x 开发3D游戏》系列 第二十五节: 3D项目优化方案
  4. Software Performance Testing - Gatling基本使用
  5. 现货黄金价格分析之佛光初现
  6. 微信小程序项目目录结构以及各个文件夹和文件的作用
  7. iphone文件访问Windows共享文件夹
  8. 分布式存储服务器是什么项目,分布式存储服务器的含义是什么?分布式存储服务器的优势体现?...
  9. mac上免token一键登录跳板机
  10. 正则表达式匹配 类C语言注释