利用過濾器和反射技術對string類型的入參進行統一trim
阿新 • • 發佈:2019-03-11
url ssi shm iter exce else if put for extend
背景
最近做的一些項目都是後臺管理系統,主要是對表單數據的增刪改查操作,其中有些表單項是字符串類型的,對於這些類型的表單項就需要在保存或編輯之前要進行.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>
利用過濾器和反射技術對string類型的入參進行統一trim