小编典典

Spring Boot MVC错误编码的POST请求

spring-boot

我无法使请求编码正常工作。为了使编码正常工作,我在spring安全性中添加了过滤器:

@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);
...
}

将meta添加到我的页面:

<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请求(与其他客户端和其他方法一起使用)时,它可以正常工作,但是表单数据没有运气。我的控制器如下所示:

@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. 对于test1,Content-Type=application/json它可以正确接收该参数。
  2. 对于带有Content-Type=application/x-www-form-urlencodedget方法的test2 ,一切都很好。
  3. 对于带有Content-Type=application/x-www-form-urlencodedPOST方法的test2 ,它将返回错误的编码值。

看来问题仅在于POST方法。有什么建议么?


阅读 297

收藏
2020-05-30

共1个答案

小编典典

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

我只是从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。因此,下次,只要设置属性(如有)即可!要设置的属性是

# 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 WikiTomcat 8从8.0.0(具体来说是8.0.0-RC3)开始,URIEncoding元素上的attribute
的默认值取决于“严格遵守servlet”设置。URIEncoding的默认值(严格符合性已关闭)为now
UTF-8。如果启用了“严格遵守servlet”,则默认值为ISO-8859-1

概括地说,不需要在Tomcat Config neigter中设置UriEncoding。

2020-05-30