Thymeleaf Spring MVC的UTF-8编码问题

时间:2019-05-15 10:27:56

标签: java spring utf-8 thymeleaf tomcat9

我对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中
  • 检查了可能与此问题有关的堆栈溢出问题的所有答案,并验证了排名较高的所有答案(包括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。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

因此,这似乎很有用,但是您是否导航到目录结构,右键单击包含页面的文件夹,然后选择“刷新”?

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

如果不执行此操作,则不会接受更改。