在使用spring mvc时, 常见请求类型
form表单: contentType:application/x-www-form-urlencoded
json数据: contentType:application/json
单个参数: contentType:application/text
第1,2种使用对象接收 , 第3种使用基本类型接收
不可避免的用户会输入些空白字符, 要么前端要么后端进行trim操作.
使用过滤器统一处理字段值2端空白字符. json类型也能处理.
很懒直接上代码.
package com.httx.btb.common.web.filter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
*param参数去除空格并写回
*
*@ClassName: ParameterRequestWrapper
*@author yechao
*@date 2017年9月5日 下午12:35:03
*@Description: TODO
*/
public class ParameterRequestWrapper extends HttpServletRequestWrapper {
private Map<String, String[]> params = new HashMap<String, String[]>();
private ServletInputStream sis = null;
/*
* 获得输入流
* json数据
* @see javax.servlet.ServletRequestWrapper#getInputStream()
*/
@Override
public ServletInputStream getInputStream() throws IOException {
if (this.sis != null) {
return this.sis;
}
return super.getInputStream();
}
/*
* @当使用?a=1&b=2请求时 (non-Javadoc)
*
* @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String)
*/
@Override
public String getParameter(String name) {
String[] values = params.get(name);
if (values == null || values.length == 0) {
return null;
}
return values[0];
}
/*
* (non-Javadoc)
*
* @see
* javax.servlet.ServletRequestWrapper#getParameterValues(java.lang.String)
*/
@Override
public String[] getParameterValues(String name) {
return params.get(name);
}
public ParameterRequestWrapper(HttpServletRequest request) {
super(request);
// 将参数表,赋予给当前的Map以便于持有request中的参数
this.params.putAll(request.getParameterMap());
this.modifyParameterValues();
String contentType = request.getContentType();
if (contentType == null || !contentType.contains("application/json")) {
return;
}
try {
if (request.getInputStream() != null) {
this.sis = replaceInputStream(request.getInputStream());
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 重载一个构造方法
*
* @param request
* @param extendParams
*/
public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams) {
this(request);
addAllParameters(extendParams);// 这里将扩展参数写入参数表
}
public ServletInputStream replaceInputStream(ServletInputStream oldSis) {
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(oldSis));
StringBuffer sb = new StringBuffer();
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line);
}
String body = sb.toString();
if (!body.isEmpty()) {
//处理json数据字段值2端的空白
body = body.replaceAll("\\s+(?=\",)", "");// 断言后面能匹配到",
body = body.replaceAll("(?<=\":\")\\s+", ""); // 断言前面能匹配到 :"
}
byte[] myBytes = body.getBytes();
ServletInputStream sis = new ServletInputStream() {
private int lastIndexRetrieved = -1;
private ReadListener readListener = null;
@Override
public boolean isFinished() {
return (lastIndexRetrieved == myBytes.length - 1);
}
@Override
public boolean isReady() {
// This implementation will never block
// We also never need to call the readListener from this
// method, as this method will never return
// false
return isFinished();
}
@Override
public void setReadListener(ReadListener readListener) {
this.readListener = readListener;
if (!isFinished()) {
try {
readListener.onDataAvailable();
} catch (IOException e) {
readListener.onError(e);
}
} else {
try {
readListener.onAllDataRead();
} catch (IOException e) {
readListener.onError(e);
}
}
}
@Override
public int read() throws IOException {
int i;
if (!isFinished()) {
i = myBytes[lastIndexRetrieved + 1];
lastIndexRetrieved++;
if (isFinished() && (readListener != null)) {
try {
readListener.onAllDataRead();
} catch (IOException ex) {
readListener.onError(ex);
throw ex;
}
}
return i;
} else {
return -1;
}
}
};
return sis;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
/**
* 将parameter的值去除空格后重写回去
*/
public void modifyParameterValues() {
Set<String> set = params.keySet();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String key = (String) it.next();
String[] values = params.get(key);
for (int i = 0; i < values.length; i++) {
if (values[i] == null) {
continue;
}
values[i] = values[i].trim();
}
params.put(key, values);
}
}
/**
* 增加多个参数
*
* @param otherParams
*/
public void addAllParameters(Map<String, Object> otherParams) {
for (Map.Entry<String, Object> entry : otherParams.entrySet()) {
addParameter(entry.getKey(), entry.getValue());
}
}
/**
* 增加参数
*
* @param name
* @param value
*/
public void addParameter(String name, Object value) {
if (value != null) {
if (value instanceof String[]) {
params.put(name, (String[]) value);
} else if (value instanceof String) {
params.put(name, new String[] { (String) value });
} else {
params.put(name, new String[] { String.valueOf(value) });
}
}
}
}