gpt4 book ai didi

java - Thymeleaf Spring MVC 的 UTF-8 编码问题

转载 作者:行者123 更新时间:2023-11-30 05:38:39 27 4
gpt4 key购买 nike

我对 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整个配置使用注释。 我无法控制 过滤器类顺序 - 参见 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。

最佳答案

不幸的是,我必须回答我自己的问题。

要从属性文件中读取 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
}

关于java - Thymeleaf Spring MVC 的 UTF-8 编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56147137/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com