博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot设置Filter过滤请求参数
阅读量:6775 次
发布时间:2019-06-26

本文共 2645 字,大约阅读时间需要 8 分钟。

hot3.png

在使用springBoot进行项目开发时,遇到的需求是需要对用户上传的数据进行过滤,比如去除“< ' ^ %”等敏感字符。

自己在做的时候想到了两个办法去实现

1.写一个过滤方法,在有数据操作的地方调用方法进行过滤,将过滤以后的字符串重新赋值。在百度中找到了一个前辈写的blog,觉得很不错就直接拿过来用了。

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。

首先是新建一个SecFilter类,实现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 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);

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

不过,在使用以上方法后,虽然实现了功能需求,但是还是有一些不对的地方,这种做法仅供参考,还需要进一步的优化。或者使用其他更好的办法实现,欢迎大家指正。

转载于:https://my.oschina.net/alexnine/blog/730706

你可能感兴趣的文章
需求评审之实战演练
查看>>
LLVM/Clang On Windows 2013_09
查看>>
关于Java的Map/List
查看>>
计算机专业笔试题
查看>>
Mac 删除分区与合并分区
查看>>
我的友情链接
查看>>
【linux】redhat 下 开启ftp 服务
查看>>
linux ssh配置文件的详解
查看>>
我的友情链接
查看>>
linux read 用法
查看>>
minikebe部署
查看>>
在CentOS6.x中安装Docker
查看>>
我的友情链接
查看>>
类似Datepicker的月份选择插件
查看>>
存储过程显示输出
查看>>
我的友情链接
查看>>
CentOS 6网卡名称修改 以及 centos7 采用传统命名方式
查看>>
来食路 - 素食系列之怎么挑选时令好蔬果
查看>>
json-lib的一个BUG,Float型数据会失真
查看>>
思科 GNS3 配置 静态 NAT
查看>>