總體分析
建議:先將本文中提到的走一遍,說不定亂碼就消失了
1 CharacterEncodingFilter 設置forceResponseEncoding為true導致亂碼
表現:CharacterEncodingFilter 設置forceResponseEncoding為true導致亂碼,並且只有在訪問靜態資源的時候亂碼,並且只是在通過tomcat導致亂碼,通過瀏覽器正常訪問文件沒有亂碼。靜態資源也已經注明了<meta charset="UTF-8">
答案:原因在tomcat
解決辦法
-
apache-tomcat-9.0.34\conf\server.xml的第70行左右
Connector
標簽添加URIEncoding="UTF-8"
👇<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
-
\apache-tomcat-9.0.34\bin\catalina.bat的大概第216行,有關
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
修改為set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"-Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"-Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8
-
\apache-tomcat-9.0.34\conf\web.xml的第126行,對於DefaultServlet的配置,修改如下👇
<servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>fileEncoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>listings</param-name> <param-value>false</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
2 tomcat控制太亂碼
表現:在運行tomcat的時候控制台亂碼
答案:tomcat的\apache-tomcat-8.5.54\conf\logging.properties里面配置的編碼格式和控制台不一樣,windows系統,win10下的idea默認控制台編碼gbk
解決方法
java.util.logging.ConsoleHandler.encoding = GBK
設置java.util.logging.ConsoleHandler.encoding和控制台編碼一致
3 springmvc前后端數據傳輸亂碼
表現:前后端的傳輸數據亂碼
原因:request和response的問題
解決方法
在項目web.xml配置監聽器,修改亂碼👇
<filter>
<filter-name>filterForCharSet</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>filterForCharSet</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4 @ResponseBody導致亂碼
表現:@ResponseBody返回的數據亂碼
原因:@ResponseBody亂碼原因👇
在spring處理ResponseBody時涉及到org.springframework.http.converter.StringHttpMessageConverter這個類,該類在默認實現中將defaultCharset設為ISO-8859-1。當@RequestMapping標記的方法未配置produces屬性時,將自動使用默認編碼;如果配置了produces屬性,AbstractHttpMessageConverter中的write方法將不會受supportedMediaTypes影響,而用produce設置的header賦值給contenttype。改造一下RequestMappingHandlerAdapter的配置,springMvc.xml如下:
注意:基於spring3.2以后的配置文件。編碼配置需要放在mvc:annotation-driven/之前,否則無效。
版權聲明:本文為CSDN博主「c.」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/cckevincyh/article/details/81227864
@ResponseBody亂碼問題解決
配置spring容器👇
<!-- @Response亂碼問題解決-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" >
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=utf-8</value>
<value>text/html;charset=UTF-8</value>
<value>applicaiton/*;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
其他解決辦法👉 https://blog.csdn.net/cckevincyh/article/details/81227864 https://www.cnblogs.com/zou-zou/p/9345485.html