SpringBoot设置Filter过滤请求参数
在使用Spring Boot进行项目开发时,遇到的需求是需要对用户上传的数据进行过滤,比如去除< ' ^ %
等敏感字符
自己在做的时候想到了两个办法去实现
(1)写一个过滤方法,在有数据操作的地方调用方法进行过滤,将过滤以后的字符串重新赋值
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
首先是新建一个SensitiveWordsFilter
类,实现Filter接口,重写其中的方法,在doFilter中实现过滤
但是在实际的操作中遇到了一些问题。在使用request.getParameterMap()
并对返回值进行操作和修改时出现:
java.lang.IllegalStateException: No modifications are allowed to a locked ParameterMap
查询相关资料后得知,以上方法的返回值是不可变的,不能直接进行操作与赋值。所以需要把返回值赋值给一个新的map即可。
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 v = new Vector(params.keySet());
return v.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里面的操作是:
Map<String, String[]> newParams = new HashMap(request.getParameterMap());
HttpServletRequest request = (HttpServletRequest) req;
ParameterRequestWrapper wrapRequest = new ParameterRequestWrapper(request, newParams);
chain.doFilter(wrapRequest, response);
通过以上的操作即可实现修改请求参数
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/04/01/springboot-filter-request-parameters/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论