1

I have issue with UTF-8 characters. I've tried many solutions, but nothing is working for me. What I have right now:

  • Tomcat (server.xml):

    <Connector URIEncoding="UTF-8" useBodyEncodingForURI="true" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
    
  • Base configuration class:

    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 };
    }
    }
    
  • WebMvcConfiguration class which contains Thymeleaf configuration:

    @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 which contains the rest of the configuration:

    @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);
    }
    
  • all html pages contain:

    <meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
    
  • before I've added Thymeleaf and used jsp I've been able to display special characters

  • also checked that all files (.html) are encoded with UTF-8
  • Eclipse settings changed to keep everything in UTF-8
  • checked probably all answers on stackoverflow related to this issue and verified all higher ranked answers (including this, this and that)
  • checked Thymeleaf messaging solution (some stack question for that)
  • escaped characters \u0119 are displayed as they are - \u0119
  • created new project with same pom.xml, Spring/Thymeleaf configuration

And still instead of polish ąęłźżńłó I have ???????ó displayed on page. Any ideas?

Unfortunatelly I don't have web.xml and whole configuration uses annotations. I can't control Filter classes order - see can use @Order annotation

Used technologies: Spring Framework 5.1.6, Spring Security 5.1.5, Thymeleaf 3.0.11, Thymeleaf Spring security4 3.0.4, Maven 4, Tomcat 9.

Tomasz Dzięcielewski
  • 3,829
  • 4
  • 33
  • 47

2 Answers2

1

Unfortunatelly I have to answer my own question.

To read UTF-8 data from properties file, just use encoding property

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

basically what helped was adding some additional method calls to the configureViewResolvers method:

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

and additionaly in configure(HttpSecurity http) method I've changed the way how filter is added to this:

    @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
    }
Tomasz Dzięcielewski
  • 3,829
  • 4
  • 33
  • 47
0

So this might seem very remedial, but have you navigated to the directory structure, right clicked the folder containing your pages, and selecting refresh?

I don't know what IDE you're using, but in the past I have had to manually go into Eclipse and refresh the package containing the static content.

If you don't do this, it won't pick up on the changes.

DaveCat
  • 773
  • 1
  • 10
  • 28