springmvc字符編碼過濾器CharacterEncodingFilter的使用
字符編碼過濾器CharacterEncodingFilter
一、在web.xml中的配置
<!-- characterEncodingFilter字符編碼過濾器 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <!--要使用的字符集,一般我們使用UTF-8(保險起見UTF-8最好)--> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <!--是否強(qiáng)制設(shè)置request的編碼為encoding,默認(rèn)false,不建議更改--> <param-name>forceRequestEncoding</param-name> <param-value>false</param-value> </init-param> <init-param> <!--是否強(qiáng)制設(shè)置response的編碼為encoding,建議設(shè)置為true,下面有關(guān)于這個參數(shù)的解釋--> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <!--這里不能留空或者直接寫 ' / ' ,否者不起作用--> <url-pattern>/*</url-pattern> </filter-mapping>
二、CharacterEncodingFilter過濾器類淺析
打開該類源碼,可以看到該類有三個類屬性
private String encoding; //要使用的字符集,一般我們使用UTF-8(保險起見UTF-8最好) private boolean forceRequestEncoding = false; //是否強(qiáng)制設(shè)置request的編碼為encoding private boolean forceResponseEncoding = false; //是否強(qiáng)制設(shè)置response的編碼為encoding
主要方法只有一個,也就是下面這個,代碼邏輯很簡單,如注釋所解釋
@Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String encoding = getEncoding(); if (encoding != null) { //如果設(shè)置了encoding的值,則根據(jù)情況設(shè)置request和response的編碼 //若設(shè)置request強(qiáng)制編碼或request本身就沒有設(shè)置編碼 //則設(shè)置編碼為encoding表示的值 if (isForceRequestEncoding() || request.getCharacterEncoding() == null) { request.setCharacterEncoding(encoding); } //若設(shè)置response強(qiáng)制編碼,則設(shè)置編碼為encoding表示的值 if (isForceResponseEncoding()) { //請注意這行代碼,下面有額外提醒 response.setCharacterEncoding(encoding); } } filterChain.doFilter(request, response); }
# 額外提醒 if (isForceResponseEncoding()) { response.setCharacterEncoding(encoding); }
是在
filterChain.doFilter(request, response);
之前執(zhí)行的,這也就是說這段代碼的作用是設(shè)置response的默認(rèn)編碼方式,在之后的代碼里是可以根據(jù)需求設(shè)置為其他編碼的,即這里設(shè)置的編碼可能不是最終的編碼,網(wǎng)上很多文檔說這里設(shè)置的是最終的編碼方式,這是錯的。
SpringMVC配置字符編碼過濾器CharacterEncodingFilter來解決表單亂碼問題
1、GET請求
針對GET請求,可以配置服務(wù)器Tomcat的conf\server.xml文件,在其第一個<Connector>標(biāo)簽中,添加URIEncoding="UTF-8"即可,如下所示:
<Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
2、POST請求
但是,針對POST請求,僅配置Tomcat的server.xml文件中的<Connector標(biāo)簽不足以解決亂碼問題,因此,需要利用Spring的字符編碼過濾器:
org.springframework.web.filter.CharacterEncodingFilter
步驟:配置所開發(fā)項目的web.xml文件,添加以下內(nèi)容至文件開頭處即可:
<!-- ================start 配置spring的字符編碼過濾器================ --> <filter> <!-- 解決post亂碼問題需要配置spring編碼過濾器 --> <filter-name>characterEncoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- ================end 配置spring的字符編碼過濾器================ -->
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java?精煉解讀數(shù)據(jù)結(jié)構(gòu)的鏈表的概念與實(shí)現(xiàn)
鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針連接次序?qū)崿F(xiàn)的,每一個鏈表都包含多個節(jié)點(diǎn),節(jié)點(diǎn)又包含兩個部分,一個是數(shù)據(jù)域,一個是引用域2022-03-03java創(chuàng)建線程池的7種實(shí)現(xiàn)方法
在Java中線程池是一種管理線程的機(jī)制,它可以創(chuàng)建一組線程并重復(fù)使用它們,避免了創(chuàng)建和銷毀線程的開銷,這篇文章主要給大家介紹了關(guān)于java創(chuàng)建線程池的7種實(shí)現(xiàn)方法,需要的朋友可以參考下2023-10-10MyBatis?Plus?導(dǎo)入IdType失敗的解決
這篇文章主要介紹了MyBatis?Plus?導(dǎo)入IdType失敗的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12