解決SpringMVC獲取請(qǐng)求參數(shù)亂碼問題
使用配置:jdk18
- tomcat8.5.75 (由于10經(jīng)常會(huì)出一些莫名其妙的問題,所以就讓它去我的D盤吃灰了)
- IDEA 2021.3.2
- spring-framework-5.3.15
問題引出
當(dāng)我們使用 SpringMVC 和 thymeleaf 進(jìn)行請(qǐng)求參數(shù)的時(shí)候,習(xí)慣上會(huì)使用form搭配注解實(shí)現(xiàn)
例如如下代碼:
<form th:action="@{}" method=" "></form>
其中@{}里寫路徑,而 method 里有兩種寫法:一種是 post ,另一種是 get ,兩種寫法均會(huì)導(dǎo)致控制臺(tái)或頁面輸出亂碼問題由于get方法亂碼是由于tomcat導(dǎo)致的,所以有根本解決方法,后續(xù)會(huì)說而post方法的亂碼是因?yàn)槲覀儧]有設(shè)置相應(yīng)編碼,直接進(jìn)行獲取請(qǐng)求參數(shù),況且,如果設(shè)置編碼,但是如果有
<load-on-startup>1</load-on-startup>
獲取參數(shù)在前,依然會(huì)導(dǎo)致亂碼問題,所以我們需要在獲取請(qǐng)求參數(shù)之前就要設(shè)置編碼解決方案
get方法亂碼解決方案
在 *tomcat* 文件夾里找到 *conf* 文件夾,里面的 *server.xml* 文件,點(diǎn)擊編輯,找到
在這個(gè)位置,添加*URIEncoding="UTF-8"*即可解決
post方法亂碼解決方案
正因?yàn)榇嬖谏鲜鰡栴},所以我們需要考慮,是否存在比servlet執(zhí)行時(shí)間更早的組件。
服務(wù)器三大組件:
- 監(jiān)聽器
- 過濾器
- servlet
而監(jiān)聽器是用于監(jiān)聽servletContext的創(chuàng)建和銷毀,所以考慮只要當(dāng)前我們?cè)L問的地址滿足過濾路徑,均會(huì)被過濾器進(jìn)行過濾,所以我們選擇在過濾器進(jìn)行編碼,且 SpringMVC 已經(jīng)提供好,直接使用即可,所以我們?cè)?*web.xml* 進(jìn)行配置(PS:不管把filter寫在哪,都會(huì)比 servlet 先進(jìn)行初始化)
其中必須要寫
<init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param>
通過源碼可以看到
首先說一下為什么找到的是這個(gè)源碼:
最主要的原因是參數(shù)里有*FilterChain*(過濾器鏈),有這個(gè)參數(shù)百分之八九十是執(zhí)行過濾的
可以看到:
*encoding*可以為空,即我們需要重新設(shè)置,否則是默認(rèn)編碼,同時(shí)也是null,所以我們上面給*encodeing*設(shè)置為*UTF-8*,讓它不為空
且 *forceRequestEncodeing* 和 *forceResponseEncodeing* 定義的時(shí)候均為 false
因?yàn)槲覀儧]有設(shè)置過 request.getCharacterEncoding() 所以默認(rèn)還是null,因此第一個(gè)if語句就可以執(zhí)行,也就是執(zhí)行 *request.setCharacterEncoding(encoding);* 這條語句 (請(qǐng)求編碼) 即
<init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param>
如果想要設(shè)置響應(yīng)編碼 就需要將下一個(gè) if 語句也執(zhí)行 , 執(zhí)行條件可以看到是讓 *isForceResponseEncoding()* 為 *true* 所以有
<init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param>
這樣SpringMVC請(qǐng)求參數(shù)亂碼問題就可以解決了~~
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java多線程 Producer and Consumer設(shè)計(jì)模式
這篇文章主要介紹了Java多線程 Producer and Consumer設(shè)計(jì)模式,producer是生產(chǎn)者的意思:指生產(chǎn)數(shù)據(jù)的線程,consumer是消費(fèi)者的意思,指的是使用數(shù)據(jù)的線程,下文圍繞Producer及Consumer展開話題,需要的朋友可以參考一下2021-10-10Spring Boot 項(xiàng)目中使用Swagger2的示例
本篇文章主要介紹了Spring Boot 項(xiàng)目中使用Swagger2的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01SpringBoot使用AOP統(tǒng)一日志管理的方法詳解
這篇文章主要為大家分享一個(gè)干貨:超簡(jiǎn)潔SpringBoot使用AOP統(tǒng)一日志管理,文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05詳解Java8與Runtime.getRuntime().availableProcessors()
這篇文章主要介紹了詳解Java8與Runtime.getRuntime().availableProcessors(),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06生產(chǎn)環(huán)境NoHttpResponseException異常排查解決記錄分析
這篇文章主要為大家介紹了生產(chǎn)環(huán)境NoHttpResponseException異常排查解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10使用@RequestBody傳對(duì)象參數(shù)時(shí)碰到的坑
這篇文章主要介紹了使用@RequestBody傳對(duì)象參數(shù)時(shí)碰到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08一篇文章帶了解如何用SpringBoot在RequestBody中優(yōu)雅的使用枚舉參數(shù)
這篇文章主要介紹了SpringBoot中RequestBodyAdvice使用枚舉參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08SpringBoot實(shí)現(xiàn)單文件與多文件上傳功能
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)單文件與多文件上傳功能,Spring?MVC對(duì)文件上傳做了簡(jiǎn)化,而在Spring?Boot中對(duì)此做了更進(jìn)一步的簡(jiǎn)化,文件上傳變得更為方便,下面開始演示,需要的小伙伴可以參考一下,希望對(duì)你有所幫助2022-01-01SpringBoot+WebSocket實(shí)現(xiàn)即時(shí)通訊功能(J2EE方式)
WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議,WebSocket使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù),本文給大家介紹了SpringBoot+WebSocket實(shí)現(xiàn)即時(shí)通訊功能(J2EE方式),需要的朋友可以參考下2025-01-01