在使用springBoot進行項目開發時,遇到的需求是須要對用戶上傳的數據進行過濾,好比去除「< ' ^ %」等敏感字符。java
本身在作的時候想到了兩個辦法去實現spring
1.寫一個過濾方法,在有數據操做的地方調用方法進行過濾,將過濾之後的字符串從新賦值。在百度中找到了一個前輩寫的blog,以爲很不錯就直接拿過來用了。app
public static String StringFilterUntil(String str) throws PatternSyntaxException { // 清除掉全部特殊字符 String regEx="[`~!@#$%^&()+=|{}':'//[//].<>/~!@#¥%……&*()——+|{}]"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); return m.replaceAll("").trim(); }
而後在須要進行操做的地方調用就能夠了,可是每次都調用就顯得有些麻煩和尷尬。因而就進行嘗試第二個辦法優化
2.在request到達controller以前,對參數進行過濾,將特殊字符過濾掉後,再將數據寫入request。this
首先是新建一個SecFilter類,實現Filter接口,重寫其中的方法,在dofilter中實現過濾。code
可是在實際的操做中遇到了一些問題。在使用blog
request.getParameterMap();
並對返回值進行操做和修改的時候出現了繼承
java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap 接口
查詢相關資料後得知,以上方法的返回值是不可變的,不能直接進行操做與賦值。因此須要把返回值賦值給一個新的map便可。element
new HashMap(request.getParameterMap());
在對獲得的數據進行操做完成後,須要把過濾之後的map寫到request裏面,經過百度和Google查詢資料之後,找到了解決辦法。
要把修改之後的map加入到request中須要
定義ParameterRequestWrapper 繼承HttpServletRequestWrapper
public class ParameterRequestWrapper extends HttpServletRequestWrapper { private Map params; public ParameterRequestWrapper(HttpServletRequest request, Map newParams) { super(request); this.params = newParams; } public Map getParameterMap() { return params; } public Enumeration getParameterNames() { Vector l = new Vector(params.keySet()); return l.elements(); } public String[] getParameterValues(String name) { Object v = params.get(name); if (v == null) { return null; } else if (v instanceof String[]) { return (String[]) v; } else if (v instanceof String) { return new String[] { (String) v }; } else { return new String[] { v.toString() }; } } public String getParameter(String name) { Object v = params.get(name); if (v == null) { return null; } else if (v instanceof String[]) { String[] strArr = (String[]) v; if (strArr.length > 0) { return strArr[0]; } else { return null; } } else if (v instanceof String) { return (String) v; } else { return v.toString(); } } }
而後在filter裏面的操做是:
HttpServletRequest req =(HttpServletRequest) request; ParameterRequestWrapper wrapRequest = new ParameterRequestWrapper(req,m); request = wrapRequest; chain.doFilter(request, response);
經過以上的操做便可實現修改請求參數。
不過,在使用以上方法後,雖然實現了功能需求,可是仍是有一些不對的地方,這種作法僅供參考,還須要進一步的優化。或者使用其餘更好的辦法實現,歡迎你們指正。