【问题标题】:Spring MVC with Thymeleaf and Tomcat 8 UTF-8 Encoding Issue带有 Thymeleaf 和 Tomcat 8 UTF-8 编码问题的 Spring MVC
【发布时间】:2016-01-08 00:20:11
【问题描述】:

我有一些关于编码的问题。根据this referance,我必须做所有这些,我做到了。但在那之后我的编码问题仍然存在。我正在使用 Spring MVC、Spring Security、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

我还将 pom.xml 文件更改为 UTF-8 编码。

<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>

我在互联网上尝试了所有方法,但仍然找不到解决方案。任何关于我缺少什么的想法都会很棒。

【问题讨论】:

    标签: spring-mvc tomcat encoding utf-8 thymeleaf


    【解决方案1】:

    fatiherdem,在所有情况下,您都不关注 Spring Security。试试https://stackoverflow.com/a/23051264/4380830 的答案。我和你有同样的技术栈,这个答案对我有用

    【讨论】:

    • CharacterEncodingFilter 放在CsrfFilter 之前为我解决了编码问题。
    【解决方案2】:

    我在验证消息方面遇到了同样的问题,所有代码解决方案仍然不够用。在我使用 Intellij 作为编辑器的情况下,我检查了 Transaparent native-to-ascii conversion 来解决问题。请看我的完整答案here

    【讨论】:

      【解决方案3】:

      您可以在处理前使用百里香注释这个技巧:

      【讨论】:

        猜你喜欢
        • 2019-10-02
        • 2011-08-04
        • 2012-06-11
        • 2011-08-21
        • 2011-07-05
        • 2011-11-02
        • 2017-04-27
        • 1970-01-01
        相关资源
        最近更新 更多