統一修改表單參數(表單提交的空字符串統一轉null)
1.介紹:
我們業務中有時會遇到提交的表單中某個參數為空字符串,導致后台接受的為空字符串("")而不是我們理想中的null,會增加一些不必要的處理。本文介紹通過過濾器filter統一修改表單參數。
<form method="post" action="/post">
<input type="text" name="name" value="">
<input type="submit" value="提交">
</form>
2.實現
由於自帶的request.getParameterMap()不可修改。因此我們需要自定義RequestWrapper。該RequestWrapper初始化時傳入原request的參數,並對參數進行篩選,刪除value為空字符串("")的參數。然后過濾器filter內把原request替換為自定義的RequestWrapper。
2.1 自定義RequestWrapper
import xxxx.common.util.MapRemoveUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.HashMap;
import java.util.Map;
public class ParameterRequestWrapper extends HttpServletRequestWrapper {
private Map<String, String[]> params = new HashMap<String, String[]>();
@SuppressWarnings("unchecked")
public ParameterRequestWrapper(HttpServletRequest request) {
// 將request交給父類,以便於調用對應方法的時候,將其輸出,其實父親類的實現方式和第一種new的方式類似
super(request);
//將參數表,賦予給當前的Map以便於持有request中的參數
Map<String, String[]> map = new HashMap<>(request.getParameterMap());
//刪除空字符串參數
map=MapUtils.filterEmptyParam(map);
this.params.putAll(map);
}
@Override
public String getParameter(String name) {//重寫getParameter,代表參數從當前類中的map獲取
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);
}
public void addAllParameters(Map<String, Object> otherParams) {//增加多個參數
for (Map.Entry<String, Object> entry : otherParams.entrySet()) {
addParameter(entry.getKey(), entry.getValue());
}
}
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)});
}
}
}
@Override
public Map<String, String[]> getParameterMap() {
return this.params;
}
}
2.2 ParameterEmptyFilter
import xxxx.ParameterRequestWrapper;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.http.HttpMethod;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class ParameterEmptyFilter implements Filter {
protected final Log logger = LogFactory.getLog(this.getClass());
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
String method = ((HttpServletRequest) request).getMethod();
if (HttpMethod.POST.name().equals(method)) {
ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper((HttpServletRequest) request);
filterChain.doFilter(requestWrapper, response);
return;
}
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
}
}
2.3 web.xml 加入filter
<filter>
<filter-name>parameterEmptyFilter</filter-name>
<filter-class>xxx.filter.ParameterEmptyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>parameterEmptyFilter</filter-name>
<url-pattern>/xxx/*</url-pattern>
</filter-mapping>
2.4 MapUtils
RequestWrapper會用到,用於刪除map中空key或空value。
public class MapUtils {
public static Map<String,Object> filterEmptyParam(Map<String,Object> param){
Map<String,Object> result = new HashMap<>();
param = Maps.filterValues(param, s -> s != null && (!(s instanceof String) || !((String) s).isEmpty()));
result.putAll(param);
return result;
}
}