背景
最近做的一些項目都是后台管理系統,主要是對表單數據的增刪改查操作,其中有些表單項是字符串類型的,對於這些類型的表單項就需要在保存或編輯之前要進行.trim()處理,剛開始感覺沒什么,遇到了就手動進行.trim()一下,感覺很正常,因為Java本身就提供了這么一個字符串處理的方法,感覺每次都這么做也不能嫌麻煩,理所應當。但是是隨着業務的發展,需要這么處理的地方越來越多,雖然每次都小心謹慎,但難免會有遺漏,導致不該出現問題的地方出現了問題,對於這些不該出現的低級錯誤感到痛心。於是想,能不能寫一個攔截器或者過濾器對string類型的入參進行統一trim處理,不用在數據持久化前分別對string類型的參數進行trim操作呢?於是就有了這篇文章。
原理
過濾器+重寫HttpServletRequestWrapper類,將修改后的參數列表寫回request中。
代碼示例
第一步 編寫 參數過濾器
package com.xx.controller.filter;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @description: 類描述:參數過濾器
* @author:
* @createdate: 2019/3/10 22:33
* @lastdate:
*/
public class ParamsFilter extends OncePerRequestFilter {
/**
* Same contract as for {@code doFilter}, but guaranteed to be
* just invoked once per request within a single request thread.
* See {@link #shouldNotFilterAsyncDispatch()} for details.
* <p>Provides HttpServletRequest and HttpServletResponse arguments instead of the
* default ServletRequest and ServletResponse ones.
*
* @param request
* @param response
* @param filterChain
*/
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper(request);
filterChain.doFilter(requestWrapper, response);
}
}
第二步 重寫 ParameterRequestWrapper
package com.jd.lifetravel.assistincome.controller.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/**
* @description: 類描述:重寫 ParameterRequestWrapper
* @author:
* @createdate: 2019/3/10 22:35
* @lastdate:
*/
public class ParameterRequestWrapper extends HttpServletRequestWrapper {
private Map<String, String[]> params = new HashMap<String, String[]>();
public ParameterRequestWrapper(HttpServletRequest request) {
// 將request交給父類,以便於調用對應方法的時候,將其輸出,其實父親類的實現方式和第一種new的方式類似
super(request);
// 將參數表,賦予給當前的Map以便於持有request中的參數
this.params.putAll(request.getParameterMap());
this.modifyParameterValues();
}
/**
* 重載一個構造方法
*
* @param request
* @param extendParams
*/
public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams) {
this(request);
addAllParameters(extendParams);
}
/**
* 將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);
values[0] = values[0].trim();
params.put(key, values);
}
}
/**
* 重寫getParameter,代表參數從當前類中的map獲取
*
* @param name
* @return
*/
@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);
}
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)});
}
}
}
}
第三步 在web.xml配置過濾器
<filter>
<filter-name>ParamsFilter</filter-name>
<filter-class>top.lushunde.interceptor.ParamsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ParamsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>