UTF-8 encoding in Spring MVC, problem with FORMs

2019-01-10 09:14发布

问题:

I have this in web.xml

   <filter>
        <filter-name>encoding-filter</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>forceEncoding</param-name>
        <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>encoding-filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

and at the top of file.jsp I have this:

<%@ page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>

in <head> this:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

and characters other than latin-1 set from FORM with method POST are still not correct.

回答1:

I solved this.

That filter in web.xml must be first filter in file.



回答2:

I had similar problem. When I post a form and save it in DB, it is inserted as ?????? but if I manually insert to DB using the MySQL WorkBench it works fine.

I thought the problem is only in http request encoding. So, I almost implemented all recommendations I found about this issue like change server.xml, adding filter to web.xml and changing settings in MySQL config file my.ini but it does not solve my problem.

The problem was due to two things the http request encoding and the JDBC connection. For some reason MySQL is accepting data as ISO-8859-1 not as UTF-8.

So, I reverted all changes and I made below two changes: Change Tomcat server.xml as below:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"  URIEncoding="UTF-8" />

Change Jdbc connection properties as below:

jdbc.driver_class=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/dB_Name?useUnicode=yes&characterEncoding=UTF-8
jdbc.username=root
jdbc.password

The solution key here is adding useUnicode=yes&characterEncoding=UTF-8

Add a filter like @jbb did in **web.xml:**

<filter>
     <filter-name>encoding-filter</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>forceEncoding</param-name>
     <param-value>true</param-value>
     </init-param>
 </filter>

 <filter-mapping>
     <filter-name>encoding-filter</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>

If Thymeleaf is used, change viewResolver and TemplateResolver as below:

viewResolver.setCharacterEncoding("UTF-8");
viewResolver.setContentType("text/html; charset=UTF-8");

templateResolver.setCharacterEncoding("UTF-8");


回答3:

Note that this works only for POST requests. If you want to code also GET requests (i.e. links with <a href=...>), you will have to modify your server's server.xml file, by adding URIEncoding="UTF-8" useBodyEncodingForURI="true" attributes in the <Connector> tag.

See : http://wiki.apache.org/tomcat/FAQ/CharacterEncoding