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