spring boot MVC 错误编码的 POST 请求

标签 spring spring-mvc tomcat character-encoding spring-boot

我无法使请求编码正常工作。为了编码工作,我向 spring security 添加了过滤器:

@Bean
public CharacterEncodingFilter characterEncodingFilter() {
    CharacterEncodingFilter filter = new CharacterEncodingFilter();
    filter.setEncoding("UTF-8");
    filter.setForceEncoding(true);
    return filter;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.addFilterBefore(characterEncodingFilter(), CsrfFilter.class);
...
}

将元添加到我的页面:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
...

将 UriEnconding 添加到 tomcat 8:

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
   connectionTimeout="20000"
   redirectPort="8443" />

但它没有回应任何一个。当我发送请求并调试它时,结果是错误的。例如,当我将 بای 作为请求表单的一部分发送时,我会收到 Ø¨Ø§Û 作为结果。我是否缺少配置的任何部分?

当发送有效载荷 ajax 请求时(使用 rest 客户端和 ofcource 到另一种方法)它工作正常,但表单数据没有运气。我的 Controller 看起来像这样:

@RequestMapping(value = "/test1")
@ResponseBody
public String test1(@RequestBody String req) {
    return req;
}

@RequestMapping(value = "/test2")
@ResponseBody
public String test2(@RequestParam("search") String req) {
    return req;
}

不同的尝试:

  1. 对于 Content-Type=application/json 的 test1,它正确接收了参数。
  2. 对于带有 Content-Type=application/x-www-form-urlencoded 和 get 方法的 test2,再次一切正常。
  3. 对于带有 Content-Type=application/x-www-form-urlencoded 和 POST 方法的 test2,它返回错误的编码值。

看来问题只出在 POST 方法上。有什么建议吗?

最佳答案

在深入研究了很多过滤器链并在其中移动字符编码之后,终于找到了问题所在。在字符编码开始之前,另一个过滤器正在更改编码。

我只是从 spring security 手中获取过滤器并手动将其添加为 bean 来为我进行过滤:

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

2 天或搜索和尝试,只是一个简单的答案。多么困难的方法才能找到答案

---更新---

如果您使用的是 spring boot 1.2+,则根本不需要 CharacterEncoding。默认情况下,它处于完美位置,字符编码等于 utf8。所以下一次,如果有的话就设置属性吧! the properties to set are :

# HTTP encoding (HttpEncodingProperties)
spring.http.encoding.charset=UTF-8 # the encoding of HTTP requests/responses
spring.http.encoding.enabled=true # enable http encoding support
spring.http.encoding.force=true # force the configured encoding

---更新 2---

来自 Tomcat wiki : 在 Tomcat 8 从 8.0.0(8.0.0-RC3,具体而言)开始,元素上的 URIEncoding 属性的默认值取决于“严格的 servlet 合规性” “环境。 URIEncoding 的默认值(严格遵守关闭)现在是 UTF-8。如果启用“strict servlet compliance”,则默认值为 ISO-8859-1

所以一般来说,不需要在Tomcat Config neigter中设置UriEncoding。

关于spring boot MVC 错误编码的 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31140118/

相关文章:

java - 每个实体 hibernate 两个表

java - 以编程方式将 Bean 添加到 Spring Web App 上下文

java - 当我将样式表链接到 Thymeleaf 页面时,为什么 Spring Boot 会掉线?

java - 用户的Tomcat认证和操作

java - catalina.out 连续记录相同的错误

java - Junit 5,Spring 应用程序上下文未在 @DirtiesContext 上关闭

Spring Boot JAX-RS/CXF 依赖注入(inject)适用于 JAR 但不适用于 WAR

java - 如何使用 Spring @Configuration 引用尚不存在的 bean

spring - 为什么 Spring 需要 HIbernateTransactionManager?

java - 找不到合适的默认 RequestUpgradeStrategy