在使用 SpringMVC 框架的過程中,如果前臺有包含中文的請求,或者後臺有包含中文的響應,有可能會出現亂碼的情況。在以前的 Servlet 中,我們使用 和 來設置請求和響應的編碼。在 SpringMVC 中,框架直接給我們提供了一個用來解決請求和響應的亂碼問題的過濾器 。 註意:請將 Char ...
在使用 SpringMVC 框架的過程中,如果前臺有包含中文的請求,或者後臺有包含中文的響應,有可能會出現亂碼的情況。在以前的 Servlet 中,我們使用 request.setCharacterEncoding("UTF-8");
和 response.setContentType("text/html;charset=UTF-8");
來設置請求和響應的編碼。在 SpringMVC 中,框架直接給我們提供了一個用來解決請求和響應的亂碼問題的過濾器 CharacterEncodingFilter
。註意:請將 CharacterEncodingFilter 配置在其他過濾器之前。
在 web.xml 中添加 CharacterEncodingFilter 過濾器:
<filter>
<filter-name>CharacterEncodingFilter</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>
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<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 中有三個初始化參數:encoding、forceRequestEncoding、forceResponseEncoding。
- encoding:只有在 isForceRequestEncoding = false 並且 request 中沒有設置編碼的時候才會將 request 中的編碼設置為 encoidng 中指定的編碼格式。
- forceRequestEncoding:強制設置 request 的編碼格式。forceRequestEncoding = true 的時候會強制的將 request 中的編碼設置為 encoding 中指定的編碼格式,如果 request 中已經指定了編碼格式,將會強行設置為 encoding 中的編碼格式。
- forceResponseEncoding:強制設置 response 的編碼格式。forceResponseEncoding = true 的時候會強制的將 response 中的編碼格式設置為 encoding 中指定的編碼格式。
@Override
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String encoding = getEncoding();
if (encoding != null) {
if (isForceRequestEncoding() || request.getCharacterEncoding() == null) {
request.setCharacterEncoding(encoding);
}
if (isForceResponseEncoding()) {
response.setCharacterEncoding(encoding);
}
}
filterChain.doFilter(request, response);
}