【问题标题】:UTF-8 encoding issue with Thymeleaf Spring MVCThymeleaf Spring MVC 的 UTF-8 编码问题
【发布时间】:2019-10-02 11:13:27
【问题描述】:

我对 UTF-8 字符有疑问。我已经尝试了很多解决方案,但没有什么对我有用。我现在拥有的:

  • Tomcat (server.xml):

    <Connector URIEncoding="UTF-8" useBodyEncodingForURI="true" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
    
  • 基础配置类:

    public class HomeInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { WebSecurityConfig.class };
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { WebMvcConfiguration.class };
    }
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8"); // forcing UTF-8
        filter.setForceEncoding(true);
        return new Filter[] { filter };
    }
    }
    
  • 包含 Thymeleaf 配置的 WebMvcConfiguration 类:

    @Bean
    public ThymeleafViewResolver viewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        viewResolver.setCharacterEncoding("UTF-8"); // forcing UTF-8
        viewResolver.setContentType("text/html; charset=UTF-8");
        viewResolver.setOrder(1);
        viewResolver.setViewNames(new String[] { ".html", ".xhtml" });
        return viewResolver;
    }
    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setCharacterEncoding("UTF-8"); // forcing UTF-8
        templateResolver.setApplicationContext(applicationContext);
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        templateResolver.setCacheable(true);
        return templateResolver;
    }
    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        templateEngine.setEnableSpringELCompiler(true);
        return templateEngine;
    }
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        registry.viewResolver(resolver);
    }
    
  • WebSecurityConfig 包含其余配置:

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().anonymous().antMatchers("/login**", "/*.js", "/*.css", "/*.svg").permitAll().anyRequest().authenticated()
                        .antMatchers("/login**").permitAll().and().formLogin().loginPage("/login").loginProcessingUrl("/login").usernameParameter("username")
                        .passwordParameter("password").defaultSuccessUrl("/", true).permitAll().and().logout()
                        .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login?logout").deleteCookies("JSESSIONID")
                        .invalidateHttpSession(true).permitAll();
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding("UTF-8"); // another forcing UTF-8
        filter.setForceEncoding(true);
        http.addFilterBefore(filter, CsrfFilter.class);
    }
    
  • 所有 html 页面包含:

    <meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
    
  • 在我添加 Thymeleaf 并使用 jsp 之前,我已经能够显示特殊字符

  • 还检查了所有文件 (.html) 是否使用 UTF-8 编码
  • Eclipse 设置已更改以将所有内容保留为 UTF-8
  • 可能检查了 stackoverflow 上与此问题相关的所有答案,并验证了所有排名较高的答案(包括 thisthisthat
  • 已检查 Thymeleaf 消息传递解决方案 (some stack question for that)
  • 转义字符 \u0119 按原样显示 - \u0119
  • 使用相同的pom.xml、Spring/Thymeleaf 配置创建了新项目

并且仍然而不是波兰语 ąęłźżńłó 我有 ???????ó 显示在页面上。有什么想法吗?

很遗憾我没有 web.xml 并且整个配置使用注释。 我无法控制 Filter 课程顺序 - 见can use @Order annotation

使用的技术:Spring Framework 5.1.6、Spring Security 5.1.5、Thymeleaf 3.0.11、Thymeleaf Spring security4 3.0.4、Maven 4、Tomcat 9。

【问题讨论】:

    标签: java spring utf-8 thymeleaf tomcat9


    【解决方案1】:

    很遗憾,我必须回答我自己的问题。

    要从属性文件中读取 UTF-8 数据,只需使用 encoding 属性

    @Component
    @PropertySource(value = "classpath:config/data.properties", encoding = "UTF-8")
    

    基本上帮助的是向configureViewResolvers 方法添加了一些额外的方法调用:

        @Override
        public void configureViewResolvers(ViewResolverRegistry registry) {
            ThymeleafViewResolver resolver = new ThymeleafViewResolver();
            resolver.setTemplateEngine(templateEngine());
            resolver.setCharacterEncoding("UTF-8"); // <- this was added
            resolver.setForceContentType(true); // <- this was added
            resolver.setContentType("text/html; charset=UTF-8"); // <- this was added
            registry.viewResolver(resolver);
        }
    

    另外在configure(HttpSecurity http) 方法中,我更改了过滤器添加到此的方式:

        @Override
        protected void configure(HttpSecurity http) throws Exception {
    
            CharacterEncodingFilter filter = new CharacterEncodingFilter();
            filter.setEncoding("UTF-8");
            filter.setForceEncoding(true);
    
            http.authorizeRequests().anyRequest().anonymous()
            .antMatchers("/login**", "/*.js", "/*.css", "/*.svg" ).permitAll()
            // ... some other config
            .invalidateHttpSession(true)
            .permitAll()
            .and()
            .addFilterBefore(filter, CsrfFilter.class); // <- this was added
        }
    

    【讨论】:

      【解决方案2】:

      所以这看起来很有效,但是您是否导航到目录结构,右键单击包含您的页面的文件夹,然后选择刷新?

      我不知道您使用的是什么 IDE,但过去我不得不手动进入 Eclipse 并刷新包含静态内容的包。

      如果您不这样做,它就不会接受更改。

      【讨论】:

      • 我使用的是 Eclipse 版本:2019-03 (4.11.0),刷新也没有用。
      猜你喜欢
      • 2016-01-08
      • 2011-08-04
      • 2011-07-05
      • 2011-08-21
      • 2011-11-02
      • 2017-04-27
      • 2013-12-16
      • 1970-01-01
      相关资源
      最近更新 更多