spring 引导 MVC 错误编码 POST 请求
spring boot MVC wrong encoded POST request
我无法使请求编码正常工作。为了编码工作,我添加了过滤器 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" />
但它没有回应其中的 none 个。当我发送请求并调试它时,结果是错误的。例如,当我发送 بای
作为申请表的一部分时,我收到 باÛ
作为结果。我是否缺少配置的任何部分?
当发送负载 ajax 请求时(使用 rest 客户端和另一种方法)它工作正常,但表单数据没有运气。我的控制器看起来像这样:
@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;
}
不同的尝试:
- 对于具有
Content-Type=application/json
的 test1,它正确接收了参数。
- 对于带有
Content-Type=application/x-www-form-urlencoded
和 get 方法的 test2,同样一切正常。
- 对于使用
Content-Type=application/x-www-form-urlencoded
和 POST 方法的 test2,它 returns 错误的编码值。
看来问题只出在 POST 方法上。有什么建议吗?
在深入研究了很多过滤器链并在其中移动字符编码之后,终于找到了问题所在。在字符编码开始之前,另一个过滤器正在更改编码。
我刚从 spring 安全人员那里得到过滤器,然后手动将其添加为一个 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---
From Tomcat wiki:在Tomcat 8
从8.0.0开始(具体为8.0.0-RC3),元素上URIEncoding
属性的默认值取决于"strict servlet compliance" 设置。 URIEncoding 的默认值(严格遵守关闭)现在是 UTF-8
。如果启用 "strict servlet compliance",则默认值为 ISO-8859-1
。
所以一般来说,不需要在Tomcat Config neigter中设置UriEncoding。
我无法使请求编码正常工作。为了编码工作,我添加了过滤器 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" />
但它没有回应其中的 none 个。当我发送请求并调试它时,结果是错误的。例如,当我发送 بای
作为申请表的一部分时,我收到 باÛ
作为结果。我是否缺少配置的任何部分?
当发送负载 ajax 请求时(使用 rest 客户端和另一种方法)它工作正常,但表单数据没有运气。我的控制器看起来像这样:
@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;
}
不同的尝试:
- 对于具有
Content-Type=application/json
的 test1,它正确接收了参数。 - 对于带有
Content-Type=application/x-www-form-urlencoded
和 get 方法的 test2,同样一切正常。 - 对于使用
Content-Type=application/x-www-form-urlencoded
和 POST 方法的 test2,它 returns 错误的编码值。
看来问题只出在 POST 方法上。有什么建议吗?
在深入研究了很多过滤器链并在其中移动字符编码之后,终于找到了问题所在。在字符编码开始之前,另一个过滤器正在更改编码。
我刚从 spring 安全人员那里得到过滤器,然后手动将其添加为一个 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---
From Tomcat wiki:在Tomcat 8
从8.0.0开始(具体为8.0.0-RC3),元素上URIEncoding
属性的默认值取决于"strict servlet compliance" 设置。 URIEncoding 的默认值(严格遵守关闭)现在是 UTF-8
。如果启用 "strict servlet compliance",则默认值为 ISO-8859-1
。
所以一般来说,不需要在Tomcat Config neigter中设置UriEncoding。