SpringBoot 参数 trim 处理
Posted l_learning
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 参数 trim 处理相关的知识,希望对你有一定的参考价值。
前端传值时可能将参数值前后带了空格,这些空格可能引发一些异常,如: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
*/
@Bean
public 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
@Override
public 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类型的请求参数必须通过流才能获取到值
*/
@Override
public 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获取参数
*/
@Override
public String getParameter(String name)
String[] values = params.get(name);
if(values == null || values.length == 0)
return null;
return values[0];
@Override
public String[] getParameterValues(String name)
return params.get(name);
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()
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 处理的主要内容,如果未能解决你的问题,请参考以下文章