Проблема с кодировкой UTF-8 в Thymeleaf Spring MVC - PullRequest
1 голос
/ 15 мая 2019

У меня проблема с символами 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 };
    }
    }
    
  • Класс WebMvcConfiguration, который содержит конфигурацию Thymeleaf:

    @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
  • , возможно, проверено, вероятно, все ответы в стеке потока, связанные сЭта проблема и проверены все ответы с более высоким рейтингом (включая это , это и , )
  • проверено решение для обмена сообщениями Thymeleaf ( некоторый стеквопрос для этого )
  • экранированные символы \u0119 отображаются как есть - \u0119
  • создал новый проект с такой же pom.xml, конфигурацией Spring / Thymeleaf

и все еще вместо польского ąęłźżńłó У меня ???????ó отображается на странице.Есть идеи?

К сожалению, у меня нет web.xml, и вся конфигурация использует аннотации. Я не могу контролировать Filter порядок классов - см. Можно использовать аннотацию @Order

Используемые технологии: 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 ]

1 голос
/ 17 мая 2019

К сожалению, я должен ответить на свой вопрос.

Чтобы прочитать данные 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
    }
0 голосов
/ 15 мая 2019

Так что это может показаться очень корректным, но вы перешли к структуре каталогов, щелкнули правой кнопкой мыши по папке, содержащей ваши страницы, и выбрали обновление?

Я не знаю, какую IDE вы используете, ноВ прошлом мне приходилось вручную заходить в Eclipse и обновлять пакет, содержащий статический контент.

Если вы этого не сделаете, изменения не будут приняты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...