SpringBoot設置Filter過濾請求參數

在使用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);

經過以上的操做便可實現修改請求參數。

不過,在使用以上方法後,雖然實現了功能需求,可是仍是有一些不對的地方,這種作法僅供參考,還須要進一步的優化。或者使用其餘更好的辦法實現,歡迎你們指正。

相關文章
相關標籤/搜索