spring boot MVC错误编码的POST请求

ali*_*ele 1 spring tomcat spring-mvc character-encoding spring-boot

我无法使请求编码正常工作.为了使编码工作,我添加了过滤器以弹出安全性:

@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);
...
}
Run Code Online (Sandbox Code Playgroud)

将meta添加到我的页面:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
...
Run Code Online (Sandbox Code Playgroud)

将UriEnconding添加到tomcat 8:

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
   connectionTimeout="20000"
   redirectPort="8443" />
Run Code Online (Sandbox Code Playgroud)

但它没有回应他们.当我发送请求并调试它时,结果是错误的.例如,当我???作为申请表的一部分发送时,我收到باÛ了结果.我缺少配置的任何部分吗?

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

@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;
}
Run Code Online (Sandbox Code Playgroud)

不同的尝试:

  1. 对于test1,Content-Type=application/json它正确地接收参数.
  2. 对于test2 with Content-Type=application/x-www-form-urlencoded和get方法,一切都很好.
  3. 对于test2 with Content-Type=application/x-www-form-urlencoded和POST方法,它返回错误的编码值.

似乎问题仅在于POST方法.有什么建议?

ali*_*ele 5

在深入挖掘大量过滤链并在其中移动字符编码后,终于找到了问题.另一个过滤器是在字符编码开始之前改变编码.

我只是从spring security手中获取过滤器并手动添加它作为bean来为我做过滤:

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

2天或搜索和尝试,只是一个简单的答案.找到答案真是太难了

--- UPDATE ---

如果您使用的是1.8+的spring boot,则根本不需要CharacterEncoding.它默认情况下处于完美位置,字符编码等于utf8.所以下次,只要设置属性,如果有的话!要设置的属性是:

# 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
Run Code Online (Sandbox Code Playgroud)

---更新2 ---

来自Tomcat wiki:Tomcat 8从8.0.0开始(8.0.0-RC3,具体而言),URIEncoding元素的属性的默认值取决于"严格的servlet遵从性"设置.现在是URIEncoding的默认值(严格合规关闭)UTF-8.如果启用了"严格servlet遵从性",则默认值为ISO-8859-1.

所以一般来说,没有必要在Tomcat Config neigter中设置UriEncoding.

  • 您使用的是哪种弹簧靴版本?1.2版本应该已经默认启用了`CharacterEncodingFilter`,默认为`UTF-8`.请参阅https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.2-Release-Notes#consistent-http-uribody-decoding (2认同)