在學習springmvc的時候,在jsp頁面使用post的方式提交表單,然后就出現亂碼了,於是使用springmvc提供的過濾器進行過濾,過濾器代碼如下:
2 <filter> 3 <filter-name>characterEncodingFilter</filter-name> 4 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class 6 <init-param> 7 <param-name>encoding</param-name> 8 <param-value>utf-8</param-value> 9 </init-param> 18 <init-param> 19 <param-name>forceRequestEncoding</param-name> 20 <param-value>true</param-value> 21 </init-param> 24 <init-param> 25 <param-name>forceResponseEncoding</param-name> 26 <param-value>true</param-value> 27 </init-param> 28 </filter> 29 <filter-mapping> 30 <filter-name>characterEncodingFilter</filter-name> 31 <!-- 32 /*:表示強制所有的請求先通過過濾器處理 33 參考視頻地址:https://www.bilibili.com/video/BV1sk4y167pD?p=17 34 --> 35 <url-pattern>/*</url-pattern> 36 </filter-mapping>
值得注意的是,我的html頁面也是指定了utf-8的編碼的。html頁面的代碼如下:
1 !DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="utf-8"> 5 <title>這是一個靜態頁面</title> 6 </head> 7 <body> 8 這是一個靜態頁面 9 </body> 10 </html>
但是啟動服務器訪問就是亂碼,我單獨將這個文件使用瀏覽器打開,頁面是沒有亂碼的。這說明應該是我服務器配置的問題。
通過查閱資料,將過濾器的forceResponseEncoding去掉即可,也就是不強制響應頭使用utf-8的編碼。具體的原因還是有點懵逼,但是我看了很多人的代碼
他們配置過濾器的時候,是不會配置forceResponseEncoding、forceRequestEncoding的,也就是使用最多的是一下的過濾器代碼:
2 <filter> 3 <filter-name>characterEncodingFilter</filter-name> 4 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class 6 <init-param> 7 <param-name>encoding</param-name> 8 <param-value>utf-8</param-value> 9 </init-param> 28 </filter> 29 <filter-mapping> 30 <filter-name>characterEncodingFilter</filter-name> 31 <!-- 32 /*:表示強制所有的請求先通過過濾器處理 33 參考視頻地址:https://www.bilibili.com/video/BV1sk4y167pD?p=17 34 --> 35 <url-pattern>/*</url-pattern> 36 </filter-mapping>
至於為什么強制了響應頭response的編碼方式,訪問html頁面會造成亂碼,這具體的原因還是不知道。以后使用springmvc配置的時候,如果配置過濾器就要留點心了。我在網上也找到了和我一樣問題的人,參考博客地址:
https://blog.csdn.net/Knightletter/article/details/108394048?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase
這是我使用第一種處理靜態資源的方法處理出現的問題,也就是由springmvc轉發給tomcat默認的servlet處理靜態資源的方式。
第二種方式的,是使用springmvc自帶的ResourceHttpRequestHandler這個處理器對象進行處理,也就是在springmvc的配置文件中加入以下配置:
<mvc:resources mapping="/static/**" location="/static/"/>
這里我將所有的靜態資源都放在了一個名為static文件夾下,如下圖所示:
這樣就可以避免配置多個<mvc:resources了。並且第二種方式就算過濾器的response強制了編碼,訪問靜態頁面的時候還是不會亂碼的。並且第二種方法更加符合實際開發的使用。所以處理springmvc處理靜態資源文件的話,都是建議使用第二種方式。
參考視頻地址:https://www.bilibili.com/video/BV1sk4y167pD?p=38