前端传值时可能将参数值前后带了空格,这些空格可能引发一些异常,如: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);
}
}
}
}
}
}