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);

通过以上的操作即可实现修改请求参数

上一篇 No modifications are allowed to a locked ParameterMap 解决方案
下一篇 Spring Bean 如何重新注入?
目录
文章列表
1 React Native学习之React Flexbox布局
React Native学习之React Flexbox布局
2
Spring Boot RestTemplate 自定义返回码异常处理
Spring Boot RestTemplate 自定义返回码异常处理
3
Spring Cloud获取本地服务实例方法getLocalServiceInstance()过时
Spring Cloud获取本地服务实例方法getLocalServiceInstance()过时
4
响应式编程以及 Spring Boot Webflux 快速入门
响应式编程以及 Spring Boot Webflux 快速入门
5
CURL使用SSL证书访问HTTPS
CURL使用SSL证书访问HTTPS
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。