在使用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);
经过以上的操做便可实现修改请求参数。
不过,在使用以上方法后,虽然实现了功能需求,可是仍是有一些不对的地方,这种作法仅供参考,还须要进一步的优化。或者使用其余更好的办法实现,欢迎你们指正。