Spring 带有 Thymeleaf 的 MVC 和 Tomcat 8 UTF-8 编码问题
Spring MVC with Thymeleaf and Tomcat 8 UTF-8 Encoding Issue
我有一些关于编码的问题。根据 this referance 我必须做所有这些,我做到了。但是我的编码问题仍然存在。我正在使用 Spring MVC、Spring 安全、Thymeleaf、Tomcat 8 和 Maven 3。
这是一些屏幕截图。
我用模型传递了字符串,它正在工作。
这是来自我的 message.properties 文件的验证消息。发生编码错误。
我正在尝试将一些记录保存到数据库,但再次发生错误。
这是我所做的。
我编辑了 Tomcat 的 server.xml 配置并添加了 UTF-8 编码。
server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
useBodyEncodingForURI="true"
URIEncoding="UTF-8"
redirectPort="8443" />
我在配置文件夹中创建了 CharacterEncodingFilter。
CharacterEncodingFilter.java
@WebFilter(urlPatterns = {"/*"})
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig)
throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setContentType("text/html; charset=UTF-8");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
我所有的 html 文件都有这个用于编码的元标记行。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
我的 Thymeleaf 配置也设置为 UTF-8 编码。
@Bean
@Description("Thymeleaf template resolver serving HTML 5")
public ServletContextTemplateResolver templateResolver() {
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
templateResolver.setPrefix("/WEB-INF/html/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("LEGACYHTML5");
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setCacheable(false);
return templateResolver;
}
@Bean
@Description("Thymeleaf template engine with Spring integration")
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
return templateEngine;
}
@Bean
@Description("Thymeleaf view resolver")
public ThymeleafViewResolver viewResolver() {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setContentType("text/html;charset=UTF-8");
viewResolver.setCharacterEncoding("utf-8");
return viewResolver;
}
我用这样的 UTF-8 编码创建了我的数据库。
postgres=# CREATE USER unicodeuser WITH PASSWORD 'mypass123';
postgres=# CREATE DATABASE unicode WITH ENCODING 'UTF8' OWNER unicodeuser;
postgres=# GRANT ALL ON DATABASE unicode TO unicodeuser;
我为编码创建了 JAVA_OPTS 环境变量。
JAVA_OPTS=-DuriEncoding=UTF-8 -Dfile.encoding=UTF-8
我还为 UTF-8 编码更改了我的 pom.xml 文件。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
我在互联网上尝试了所有方法,但仍然找不到解决方案。任何关于我所缺少的东西的想法都会很棒。
fatih erdem,在你所有的情况下你都没有注意 Spring 安全。尝试 答案。我和你有同样的技术栈,这个答案对我有用
我在验证消息方面遇到了同样的问题,所有代码解决方案仍然不够。在我使用 Intellij 作为编辑器的情况下,我检查了 Transaparent native-to-ascii conversion
来解决问题。请看我完整的回答.
你可以在处理之前使用 thymeleaf 注释这个技巧:
我有一些关于编码的问题。根据 this referance 我必须做所有这些,我做到了。但是我的编码问题仍然存在。我正在使用 Spring MVC、Spring 安全、Thymeleaf、Tomcat 8 和 Maven 3。
这是一些屏幕截图。
我用模型传递了字符串,它正在工作。
这是来自我的 message.properties 文件的验证消息。发生编码错误。
我正在尝试将一些记录保存到数据库,但再次发生错误。
这是我所做的。
我编辑了 Tomcat 的 server.xml 配置并添加了 UTF-8 编码。
server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
useBodyEncodingForURI="true"
URIEncoding="UTF-8"
redirectPort="8443" />
我在配置文件夹中创建了 CharacterEncodingFilter。
CharacterEncodingFilter.java
@WebFilter(urlPatterns = {"/*"})
public class CharacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig)
throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setContentType("text/html; charset=UTF-8");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
我所有的 html 文件都有这个用于编码的元标记行。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
我的 Thymeleaf 配置也设置为 UTF-8 编码。
@Bean
@Description("Thymeleaf template resolver serving HTML 5")
public ServletContextTemplateResolver templateResolver() {
ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver();
templateResolver.setPrefix("/WEB-INF/html/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode("LEGACYHTML5");
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setCacheable(false);
return templateResolver;
}
@Bean
@Description("Thymeleaf template engine with Spring integration")
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
return templateEngine;
}
@Bean
@Description("Thymeleaf view resolver")
public ThymeleafViewResolver viewResolver() {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setContentType("text/html;charset=UTF-8");
viewResolver.setCharacterEncoding("utf-8");
return viewResolver;
}
我用这样的 UTF-8 编码创建了我的数据库。
postgres=# CREATE USER unicodeuser WITH PASSWORD 'mypass123';
postgres=# CREATE DATABASE unicode WITH ENCODING 'UTF8' OWNER unicodeuser;
postgres=# GRANT ALL ON DATABASE unicode TO unicodeuser;
我为编码创建了 JAVA_OPTS 环境变量。
JAVA_OPTS=-DuriEncoding=UTF-8 -Dfile.encoding=UTF-8
我还为 UTF-8 编码更改了我的 pom.xml 文件。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
我在互联网上尝试了所有方法,但仍然找不到解决方案。任何关于我所缺少的东西的想法都会很棒。
fatih erdem,在你所有的情况下你都没有注意 Spring 安全。尝试 答案。我和你有同样的技术栈,这个答案对我有用
我在验证消息方面遇到了同样的问题,所有代码解决方案仍然不够。在我使用 Intellij 作为编辑器的情况下,我检查了 Transaparent native-to-ascii conversion
来解决问题。请看我完整的回答
你可以在处理之前使用 thymeleaf 注释这个技巧: