У меня проблема с символами UTF-8. Я пробовал много решений, но ничего не работает для меня. Что у меня есть прямо сейчас:
Tomcat (сервер.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\u0119 отображаются как есть - \u0119pom.xml, конфигурацией Spring/ThymeleafИ еще вместо полировки
ąęłźżńłó
у меня есть
???????ó
отображается на странице. Есть идеи?
К сожалению у меня нет
web.xml
и вся конфигурация использует аннотации. я не могу контролировать
— см. можно использовать аннотацию @OrderFilter
порядок занятий
Используемые технологии: Spring Framework 5.1.6, Spring Security 5.1.5, Thymeleaf 3.0.11, Thymeleaf Spring security4 3.0.4, Maven 4, Tomcat 9.




Так что это может показаться очень полезным, но вы перешли к структуре каталогов, щелкнули правой кнопкой мыши папку, содержащую ваши страницы, и выбрали «Обновить»?
Я не знаю, какую IDE вы используете, но в прошлом мне приходилось вручную заходить в Eclipse и обновлять пакет, содержащий статическое содержимое.
Если вы этого не сделаете, изменения не будут учтены.
К сожалению, я должен ответить на свой вопрос.
Чтобы прочитать данные 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
}
Я использую версию Eclipse: 2019-03 (4.11.0), и обновление тоже не помогает.