激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - springboot清除字符串前后空格與防xss攻擊方法

springboot清除字符串前后空格與防xss攻擊方法

2021-12-08 11:10qiuzhenjie Java教程

這篇文章主要介紹了springboot清除字符串前后空格與防xss攻擊方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

springboot清除字符串前后空格與防xss攻擊

一、查看WebMvcAutoConfiguration.class中的方法源碼

?
1
2
3
4
5
6
7
protected ConfigurableWebBindingInitializer getConfigurableWebBindingInitializer() {
    try {
        //從容器中獲取
        return (ConfigurableWebBindingInitializer)this.beanFactory.getBean(ConfigurableWebBindingInitializer.class);
    } catch (NoSuchBeanDefinitionException ex) {
      return super.getConfigurableWebBindingInitializer();
    }

可以發(fā)現(xiàn)ConfigurableWebBindingInitializer是從容器(beanFactory)中獲取到的,所以我們可以配置一個(gè)

ConfigurableWebBindingInitializer來替換默認(rèn)的,只需要在容器中添加一個(gè)我們自定義的轉(zhuǎn)換器即可。

當(dāng)我們創(chuàng)建了自己的ConfigurableWebBindingInitializer這個(gè)Bean,Spring boot就會(huì)自動(dòng)使用它來配置Spring MVC實(shí)現(xiàn)參數(shù)的類型轉(zhuǎn)換。

二、自定義屬性編輯器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/**
     *
     * @description 與spring mvc的@InitBinder結(jié)合 用于防止XSS攻擊
     */
     class StringEscapeEditor extends PropertyEditorSupport {
        /** 轉(zhuǎn)義HTML */
        private boolean escapeHTML;
        /** 轉(zhuǎn)義javascript */
        private boolean escapeJavaScript;
        /** 是否將空字符串轉(zhuǎn)換為null */
        private final boolean emptyAsNull;
        /** 是否去掉前后空格 */
        private final boolean trimmed;
        public StringEscapeEditor() {
            this(true,true,false,true);
        }
        public StringEscapeEditor(boolean escapeHTML, boolean escapeJavaScript) {
            this(true,true,escapeHTML,escapeJavaScript);
        }
        public StringEscapeEditor(boolean emptyAsNull,boolean trimmed, boolean escapeHTML, boolean escapeJavaScript) {
            super();
            this.emptyAsNull = emptyAsNull;
            this.trimmed = trimmed;
            this.escapeHTML = escapeHTML;
            this.escapeJavaScript = escapeJavaScript;
        }
        @Override
        public String getAsText() {
            Object value = getValue();
            if(Objects.nonNull(value))
            {
                return value.toString();
            }
            return value != null ? value.toString() : null;
        }
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            String value = text;
            if (value == null || emptyAsNull && text.isEmpty()) {
                //do nothing
            } else if (trimmed) {
                //去字符傳參數(shù)前后空格
                value = value.trim();
            }
            if (escapeHTML) {
                //HTML轉(zhuǎn)義(防止XSS攻擊)
                //HtmlUtils.htmlEscape 默認(rèn)的是ISO-8859-1編碼格式,會(huì)將中文的某些符號(hào)進(jìn)行轉(zhuǎn)義。
                //如果不想讓中文符號(hào)進(jìn)行轉(zhuǎn)義請(qǐng)使用UTF-8的編碼格式。例如:HtmlUtils.htmlEscape(text, "UTF-8")
                value = HtmlUtils.htmlEscape(value, "UTF-8");
            }
            if (escapeJavaScript) {
                //javascript轉(zhuǎn)義(防止XSS攻擊)
                value = JavaScriptUtils.javaScriptEscape(value);
            }
            setValue(value);
        }
    }

三、創(chuàng)建WebBindingInitializerConfiguration類

加上@Bean注解,交給spring容器管理。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Configuration
public class WebBindingInitializerConfiguration {
    @Bean
    public ConfigurableWebBindingInitializer getConfigurableWebBindingInitializer() {
        ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer();
        FormattingConversionService conversionService = new DefaultFormattingConversionService();
        //we can add our custom converters and formatters
        //conversionService.addConverter(...);
        //conversionService.addFormatter(...);
        initializer.setConversionService(conversionService);
        //we can set our custom validator
        //initializer.setValidator(....);
        //here we are setting a custom PropertyEditor
        initializer.setPropertyEditorRegistrar(propertyEditorRegistry -> {
            propertyEditorRegistry.registerCustomEditor(String.class,
                    new StringEscapeEditor());
        });
        return initializer;
    }
}

springboot去除參數(shù)中前后空格說明

一、 需求

使用SpringBoot使用過濾器去除@RequestBody參數(shù)兩端的空格;一般我們?nèi)テ胀ǖ恼?qǐng)求我們都會(huì)對(duì)請(qǐng)求參數(shù)進(jìn)行驗(yàn)證。

Java也提供了@notNull和@notBlank這種驗(yàn)證方式,但是對(duì)@RequestBody 這種只能驗(yàn)證是不是非空,對(duì)數(shù)據(jù)兩端的空格未進(jìn)行處理,同時(shí)大家也不想遍歷一遍參數(shù)然后再處理再封裝到對(duì)象中,正好項(xiàng)目中有這個(gè)需要,所以就參考別的做了Post請(qǐng)求中針對(duì)application/json格式的有@RequestBody注解的參數(shù)進(jìn)行了去空格處理

二、 解決方法

2.1 新建一個(gè)過濾器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Component
@WebFilter(urlPatterns = "/**", filterName = "ParamsFilter", dispatcherTypes = DispatcherType.REQUEST)
public class ParamsFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        ParameterRequestWrapper parmsRequest = new ParameterRequestWrapper((HttpServletRequest) request);
        chain.doFilter(parmsRequest, response);
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void destroy() {
    }
}

2.2 實(shí)現(xiàn)ParameterRequestWrapper

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import com.alibaba.fastjson.JSON;
/**
 * @author :
 * @description
 * @date : 2021/4/22
 */
public class ParameterRequestWrapper extends HttpServletRequestWrapper {
    private Map<String , String[]> params = new HashMap<>();
    public ParameterRequestWrapper(HttpServletRequest request) {
        super(request);
        Map<String, String[]> requestMap=request.getParameterMap();
        this.params.putAll(requestMap);
        this.modifyParameterValues();
    }
    @Override
    public ServletInputStream getInputStream() throws IOException {
        if(!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)){
            return super.getInputStream();
        }
        String json = IOUtils.toString(super.getInputStream(), "utf-8");
        if (StringUtils.isEmpty(json)) {
            return super.getInputStream();
        }
        Map<String,Object> map= jsonStringToMap(json);
        ByteArrayInputStream bis = new ByteArrayInputStream(JSON.toJSONString(map).getBytes("utf-8"));
        return new MyServletInputStream(bis);
    }
    public void modifyParameterValues(){
        Set<String> set = params.keySet();
        Iterator<String> it = set.iterator();
        while(it.hasNext()){
            String key= it.next();
            String[] values = params.get(key);
            values[0] = values[0].trim();
            params.put(key, values);
        }
    }
    @Override
    public String getParameter(String name) {
        String[]values = params.get(name);
        if(values == null || values.length == 0) {
            return null;
        }
        return values[0];
    }
    @Override
    public String[] getParameterValues(String name) {
        return params.get(name);
    }
    class MyServletInputStream extends ServletInputStream {
        private ByteArrayInputStream bis;
        public MyServletInputStream(ByteArrayInputStream bis){
            this.bis=bis;
        }
        @Override
        public boolean isFinished() {
            return true;
        }
        @Override
        public boolean isReady() {
            return true;
        }
        @Override
        public void setReadListener(ReadListener listener) {
        }
        @Override
        public int read(){
            return bis.read();
        }
    }
    public static Map<String, Object> jsonStringToMap(String jsonString) {
        Map<String, Object> map = new HashMap<>();
        JSONObject jsonObject = JSONObject.parseObject(jsonString);
        for (Object k : jsonObject.keySet()) {
            Object o = jsonObject.get(k);
            if (o instanceof JSONArray) {
                List<Map<String, Object>> list = new ArrayList<>();
                Iterator<Object> it = ((JSONArray) o).iterator();
                while (it.hasNext()) {
                    Object obj = it.next();
                    list.add(jsonStringToMap(obj.toString()));
                }
                map.put(k.toString(), list);
            } else if (o instanceof JSONObject) {
                map.put(k.toString(), jsonStringToMap(o.toString()));
            } else {
                if (o instanceof String) {
                    map.put(k.toString(), o.toString().trim());
                } else {
                    map.put(k.toString(), o);
                }
            }
        }
        return map;
    }
}

三、 完美解決

springboot清除字符串前后空格與防xss攻擊方法springboot清除字符串前后空格與防xss攻擊方法

參數(shù)前后空格完美去除!

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://www.jianshu.com/p/2b8ac1adb7a1

延伸 · 閱讀

精彩推薦
  • Java教程升級(jí)IDEA后Lombok不能使用的解決方法

    升級(jí)IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級(jí),尋思已經(jīng)有好久沒有升過級(jí)了。升級(jí)完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對(duì)java開發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對(duì)于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程xml與Java對(duì)象的轉(zhuǎn)換詳解

    xml與Java對(duì)象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對(duì)象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線程模擬多人同時(shí)搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 国产精品成人亚洲一区二区 | 国产在线精品一区二区 | 免费在线一级毛片 | 欧美一级视屏 | 一级毛片免费观看在线 | 亚洲精品一区二区三区大胸 | 欧美激情视频一区二区免费 | 91麻豆蜜桃一区二区三区 | 久草在线高清视频 | 91成人免费网站 | 亚洲婷婷日日综合婷婷噜噜噜 | 在线观看国产日韩 | a级高清免费毛片av在线 | 国产一级免费电影 | 久久影片| 高清国产午夜精品久久久久久 | 久久精品一区二区三区四区五区 | 欧美日韩国产综合网 | 一区二区三区精品国产 | 成年性羞羞视频免费观看无限 | 91网在线播放| 国产成人综合在线观看 | 国产激情精品一区二区三区 | 亚洲日韩精品欧美一区二区 | 操皮视频 | 成年片黄色日本大片网站视频 | 超碰97最新 | av在线播放免费观看 | 一级免费视频 | 免费欧美一级视频 | 日本欧美一区二区三区在线观看 | 极色品影院 | 欧美亚洲啪啪 | 久久免费观看一级毛片 | 亚洲成人免费视频在线 | 国内外一级毛片 | 国内精品久久久久久久影视红豆 | 国产免费一级大片 | 天天曰夜夜操 | 49vv看片免费 | 牛牛视频在线 |