ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

spring boot thymeleaf无法从POST正确编码UTF-8字符

2019-11-19 15:28:53  阅读:460  来源: 互联网

标签:spring-boot encoding thymeleaf spring spring-mvc


我正在用百里香模板引擎评估弹簧靴.我正面临UTF8字符表单发布问题.

对于最简单的form.html帖子示例:

<head>
  <title>test</title>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>

<body>

<form th:action="@{/test/doPost}" method="post">
  <input type="text" name="name" />
  <button type="submit">submit</button>
</form>

并在控制器中:

@Controller
@RequestMapping("/test")
public class TestController {

  private Logger logger = LoggerFactory.getLogger(getClass());

  @RequestMapping(value = "/form", method = RequestMethod.GET)
  public String showForm() {
    return "test/form";
  }

  @RequestMapping(value = "/doPost", method = RequestMethod.POST)
  public String doPost(@RequestBody String body,
                       @RequestParam(value = "name", required = true) String name) {
    logger.info("body = {}", body);
    logger.info("name = {}", name);
    return "redirect:/test/form";
  }
}

在此示例中,Spring MVC(或百里香叶)无法正确编码具有UTF-8字符的形式.

如果输入ä,我将看到以下日志:

TestController - body = name=%C3%83%C2%A4
TestController - name = ä

ä应该被编码为.正文应该是name =ä,但是我不知道为什么它变成Ã并被解码为错误的字符.

我用Google搜索并找到了一些解决方案,例如添加编码过滤器:

  @Bean
  public Filter characterEncodingFilter() {
    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
    characterEncodingFilter.setEncoding("UTF-8");
    characterEncodingFilter.setForceEncoding(true);
    return characterEncodingFilter;
  }

但是没有用.

另一个解决方案是thymeleafViewResolver.setCharacterEncoding(“ UTF-8”);通过这种方式:

  @Bean
  public SpringResourceTemplateResolver templateResolver() {
    final SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
    templateResolver.setCacheable(false);
    templateResolver.setPrefix("classpath:/templates/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode("HTML5");
    return templateResolver;
  }

  @Bean
  public SpringTemplateEngine springTemplateEngine() {
    SpringTemplateEngine springTemplateEngine = new SpringTemplateEngine();
    springTemplateEngine.setTemplateResolver(templateResolver());

    return springTemplateEngine;
  }

  @Bean
  public ThymeleafViewResolver viewResolver() {
    ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();
    thymeleafViewResolver.setTemplateEngine(springTemplateEngine());
    thymeleafViewResolver.setCharacterEncoding("UTF-8");
    return thymeleafViewResolver;
  }

但这也不起作用.

而且,ThymeleafViewResolver的characterEncoding已在ThymeleafAutoConfiguration source code中设置.似乎没有必要在此处重新定义UTF-8.

我似乎对这个问题有类似的情况:UTF-8 encoding with form post and Spring Controller.公认的解决方案是

Moving CharacterEncodingFilter to the top and forcing the encoding to
be set as UTF-8 solved the problem.

我尝试了这个:

  @Bean
  public FilterRegistrationBean filterRegistrationBean() {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean();
    CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
    characterEncodingFilter.setEncoding("UTF-8");
    characterEncodingFilter.setForceEncoding(true);
    registrationBean.setFilter(characterEncodingFilter);
    registrationBean.setOrder(0);
    return registrationBean;
  }

但仍然无法正常工作.

我认为UTF-8表单发布非常基本,但是为什么它不能在这里工作.我错过了什么吗?

环境 :

<springboot.version>1.3.0.M5</springboot.version>
<spring.version>4.2.1.RELEASE</spring.version>

非常感谢.

有点偏离主题:我使用了许多其他框架,例如JSP / wicket / grails / play1 / play2,但这些框架都不具有如此烦人的UTF-8情况.

解决方法:

This is a known issue, already fixed-该修补程序将随Spring Boot 1.3.0.RC1一起提供.

同时,您可以通过手动声明编码过滤器来解决此问题:

@Autowired
private HttpEncodingProperties httpEncodingProperties;

@Bean
public OrderedCharacterEncodingFilter characterEncodingFilter() {
    OrderedCharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
    filter.setEncoding(this.httpEncodingProperties.getCharset().name());
    filter.setForceEncoding(this.httpEncodingProperties.isForce());
    filter.setOrder(Ordered.HIGHEST_PRECEDENCE);
    return filter;
}

标签:spring-boot,encoding,thymeleaf,spring,spring-mvc
来源: https://codeday.me/bug/20191119/2037338.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有