1、添加依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.0.7</version>
</dependency>
2、处理请求参数为QueryString的参数(URL拼接参数)
/**
* 非json参数trim处理
*/
public void queryStringParamTrim(ServletRequest request) {
Map<String, String[]> params = request.getParameterMap();
params.keySet().forEach(key -> {
String[] values = params.get(key);
for (int i = 0; i < values.length; i++) {
values[i] = values[i].trim();
}
params.put(key, values);
});
}
3、处理RequestBody参数(请求参数是Json)
public ServletInputStream getInputStream() throws IOException {
if (isQueryParam()) {
return super.getInputStream();
}
String json = IoUtil.read(super.getInputStream(), StandardCharsets.UTF_8);
if (StrUtil.isEmpty(json)) {
return super.getInputStream();
}
// json字符串首尾去空格
Object trimObj = JsonTrimUtil.trimRecursive(JSONUtil.parseObj(json));
ByteArrayInputStream bis = new ByteArrayInputStream(JSONUtil.toJsonStr(trimObj).getBytes(StandardCharsets.UTF_8));
return new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() {
return bis.read();
}
};
}
JsonTrimUtil:处理json中value的空白字符串
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
public class JsonTrimUtil {
/**
* 递归处理JSONObject中的值,对字符串类型的值进行trim操作
*
* @param obj JSONObject对象
*/
public static Object trimRecursive(Object obj) {
Object data;
if (obj instanceof JSONObject) {
JSONObject json = JSONUtil.parseObj(obj);
JSONObject trimObj = new JSONObject();
json.keySet().forEach(k -> trimObj.put(k, trimRecursive(json.getObj(k))));
data = trimObj;
} else if (obj instanceof JSONArray) {
JSONArray jsonArr = JSONUtil.parseArray(obj);
JSONArray trimObj = new JSONArray();
jsonArr.forEach(k -> trimObj.add(trimRecursive(k)));
data = trimObj;
} else if (obj instanceof String){
data = obj.toString().trim();
} else {
data = obj;
}
return data;
}
}
4、完整拦截器代码 RequestParamFilter
package com.xxx.common.filter;
import com.xxx.utils.JsonTrimUtil;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ReadListener;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
* 功能描述:【请求参数处理拦截器】
*
* @version 1.0.0
* @since 2024-09-24 17:10:19
*/
@Slf4j
public class RequestParamFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) {
}
@Override
public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper((HttpServletRequest) req) {
{
if (!isQueryParam()) {
queryStringParamTrim(this.getRequest());
}
}
@Override
public ServletInputStream getInputStream() throws IOException {
if (isQueryParam()) {
return super.getInputStream();
}
String json = IoUtil.read(super.getInputStream(), StandardCharsets.UTF_8);
if (StrUtil.isEmpty(json)) {
return super.getInputStream();
}
// json字符串首尾去空格
Object trimObj = JsonTrimUtil.trimRecursive(JSONUtil.parseObj(json));
ByteArrayInputStream bis = new ByteArrayInputStream(JSONUtil.toJsonStr(trimObj).getBytes(StandardCharsets.UTF_8));
return new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() {
return bis.read();
}
};
}
private boolean isQueryParam() {
String contentType = super.getHeader(HttpHeaders.CONTENT_TYPE);
return !MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(contentType)
&& !MediaType.APPLICATION_JSON_UTF8_VALUE.equalsIgnoreCase(contentType);
}
/**
* 非json参数trim处理
*/
public void queryStringParamTrim(ServletRequest request) {
Map<String, String[]> params = request.getParameterMap();
params.keySet().forEach(key -> {
String[] values = params.get(key);
for (int i = 0; i < values.length; i++) {
values[i] = values[i].trim();
}
params.put(key, values);
});
}
};
chain.doFilter(requestWrapper, response);
}
@Override
public void destroy() {
}
}
5、添加拦截器到容器中
package com.xxx.config;
import com.xxx.common.filter.RequestParamFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
/**
* 功能描述:web 配置
*
* @version 1.0.0
* @since 2024-09-20 10:50:08
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
/**
* 添加参数拦截器
*
* @return 返回结果
*/
@Bean
public FilterRegistrationBean<RequestParamFilter> registrationBean() {
FilterRegistrationBean<RequestParamFilter> bean = new FilterRegistrationBean<>();
bean.setFilter(new RequestParamFilter());
bean.setName("requestParamFilter");
bean.addUrlPatterns("/*");
bean.setOrder(1);
return bean;
}
}