应测试要求,过滤请求参数的前后空格,考虑写个通用组件。Talk is cheap. Show me the code.
/**
* 请求参数过滤空格
*
* @Author: wangfei
* @Date: 2020/06/16 10:01
* @Version 1.0
*/
public class TrimHttpServletRequestWrapper extends HttpServletRequestWrapper {
/**
* 暂存requestbody内容
*/
private String content;
/**
* 暂存request
*/
private HttpServletRequest request;
/**
* json数据类型
*/
private static String JSON_CONTENT = "application/json";
/**
* 编码格式
*/
private static String ENCODING_UTF_8 = "utf-8";
/**
* 构造方法
*
* @param request request
*/
public TrimHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
this.request = request;
//仅处理application/json
if (JSON_CONTENT.equalsIgnoreCase(request.getContentType())) {
String content = IOUtils.toString(request.getInputStream(), ENCODING_UTF_8);//获取文本数据;
this.content = JsonUtils.jsonTrim(content).toString();
}
}
/**
* 重写
*
* @param name 参数名
* @return trim后的值
*/
@Override
public String getParameter(String name) {
String parameter = super.getParameter(name);
return parameter == null ? null : parameter.trim();
}
/**
* 重写
*
* @param name 参数名
* @return trim后的值
*/
@Override
public String[] getParameterValues(String name) {
String[] parameterValues = super.getParameterValues(name);
if (parameterValues == null || parameterValues.length < 1) {
return parameterValues;
} else {
String[] values = new String[parameterValues.length];
for (int i = 0; i < parameterValues.length; i++) {
values[i] = parameterValues[i].trim();
}
return values;
}
}
/**
* 重写
*
* @return ServletInputStream
* @throws IOException IOException
*/
@Override
public ServletInputStream getInputStream() throws IOException {
if (!JSON_CONTENT.equalsIgnoreCase(request.getContentType())) {
//非application/json数据不处理
return super.getInputStream();
} else {
ByteArrayInputStream in = new ByteArrayInputStream(this.content.getBytes(ENCODING_UTF_8));
return new ServletInputStream() {
@Override
public int read() throws IOException {
return in.read();
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
return in.read(b, off, len);
}
@Override
public int read(byte[] b) throws IOException {
return in.read(b);
}
@Override
public void setReadListener(ReadListener listener) {
}
@Override
public boolean isReady() {
return false;
}
@Override
public boolean isFinished() {
return false;
}
@Override
public long skip(long n) throws IOException {
return in.skip(n);
}
@Override
public void close() throws IOException {
in.close();
}
@Override
public synchronized void mark(int readlimit) {
in.mark(readlimit);
}
@Override
public synchronized void reset() throws IOException {
in.reset();
}
};
}
}
}
TrimHttpServletRequestWrapper类继承了HttpServletRequestWrapper,重写了几个必须的方法。其中 getParameter和getParameterValues用于处理param参数,getInputStream用于处理RequestBody。JsonUtils是自己写的一个json工具类,用于去除json元素value的前后空格,可以在笔者的另一篇文章中找到。
/**
* @Author: wangfei
* @Date: 2020/06/16 10:19
* @Version 1.0
*/
public class TrimFilter extends OncePerRequestFilter {
/**
* 过滤器
*
* @param request
* @param response
* @param filterChain
* @throws ServletException
* @throws IOException
*/
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
filterChain.doFilter(new TrimHttpServletRequestWrapper(request), response);
}
}
TrimFilter类继承了OncePerRequestFilter,将我们的TrimHttpServletRequestWrapper加入过滤链路
/**
* 配置filter
* 默认开启,可通过 filter.paramTrim=false 来关闭过滤
*
* @Author: wangfei
* @Date: 2020/06/16 10:29
* @Version 1.0
*/
@ConditionalOnProperty(prefix = "filter", name = "paramTrim", havingValue = "true", matchIfMissing = true)
@Configuration
public class TrimFilterConfiguration {
/**
* 过滤请求参数中的前后空格
* @return FilterRegistrationBean
*/
@Bean
public FilterRegistrationBean trimFilter() {
FilterRegistrationBean fitler = new FilterRegistrationBean<>();
fitler.setFilter(new TrimFilter());
fitler.addUrlPatterns("/*");
fitler.setName("TrimFilter");
fitler.setDispatcherTypes(DispatcherType.REQUEST);
return fitler;
}
}
TrimFilterConfiguration配置类,注入我们的过滤类。 默认开启过滤,可通过 filter.paramTrim=false 来关闭过滤。
以上方法仅经过粗略测试,若有发现bug请留言指正