如何配置 spring 启动应用程序以支持 UTF-8 和 GBK 编码?
How to config spring boot application to support both UTF-8 and GBK encode?
我在我的项目中使用 spring 启动,我 运行 一些编码问题。
在项目中,有一个控制器(如下)接受内容类型为 header ,"application/x-www-form-urlencoded;charset=GBK".
的请求
@RequestMapping(value = "/notify",headers ={"Content-Type=application/x-www-form-urlencoded;charset=GBK"} , method = RequestMethod.POST, produces = "application/x-www-form-urlencoded; charset=GBK")
public ResponseEntity<String> notify(@RequestParam(name = "p") String plain, @RequestParam("s") String signature), HttpServletRequest request){}
当第三方调用此api时,他们将请求body编码为GBK.Once body包含中文字符集,我得到的参数是错误的,不是人类可读的,像这样 "result������Ʒ".
因为客户端发送请求 body 使用 GBK 编码,但是 spring 引导使用 UTF-8 对请求 body 进行解码,这是 [=41] 的默认字符集编码=]开机。
项目可用不同third-parties,大部分都使用UTF-8,所以我无法通过配置yml文件将项目编码更改为GBK:
spring:
http:
encoding:
charset: GBK
enabled: true
所以我的第一个想法是反转错误的字符串我got.But我没有通过以下测试。
String para = "p=result中文的&s=ad98adj";
byte[] bytes = para.getBytes("GBK");
ByteChunk byteChunk = new ByteChunk();
byteChunk.setBytes(bytes , 0 , bytes.length);
byteChunk.setCharset(Charset.forName("utf-8"));
String receive = byteChunk.toString();//this is the wrong string
//reverse
byteChunk.reset();
bytes = receive.getBytes("GBK");
byteChunk.setBytes(bytes , 0 ,bytes.length);
byteChunk.setCharset(Charset.forName("GBK"));
receive = byteChunk.toString(); //still the wrong string
那么我如何使用单个 spring 启动应用程序来支持 GBK 和 UTF-8 编码请求。
添加CharacterEncodingFilter bean可以解决问题,见表格https://github.com/spring-projects/spring-boot/issues/1182
@Bean
CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return filter;
}
我遇到了类似的问题,发现 Spring Boot 默认启用了 "forceEncoding"。
这会导致每次 filter.
中的请求字符集被覆盖并设置为 UTF-8
见Appendix A. Common application properties
关键部分是:
Defaults to true when "force" has not been specified.
所以设置
spring.http.encoding.force=false
或
spring.http.encoding.force-request=false
应该可以解决你的问题,只要请求正确headers。
我在我的项目中使用 spring 启动,我 运行 一些编码问题。
在项目中,有一个控制器(如下)接受内容类型为 header ,"application/x-www-form-urlencoded;charset=GBK".
的请求@RequestMapping(value = "/notify",headers ={"Content-Type=application/x-www-form-urlencoded;charset=GBK"} , method = RequestMethod.POST, produces = "application/x-www-form-urlencoded; charset=GBK")
public ResponseEntity<String> notify(@RequestParam(name = "p") String plain, @RequestParam("s") String signature), HttpServletRequest request){}
当第三方调用此api时,他们将请求body编码为GBK.Once body包含中文字符集,我得到的参数是错误的,不是人类可读的,像这样 "result������Ʒ".
因为客户端发送请求 body 使用 GBK 编码,但是 spring 引导使用 UTF-8 对请求 body 进行解码,这是 [=41] 的默认字符集编码=]开机。
项目可用不同third-parties,大部分都使用UTF-8,所以我无法通过配置yml文件将项目编码更改为GBK:
spring:
http:
encoding:
charset: GBK
enabled: true
所以我的第一个想法是反转错误的字符串我got.But我没有通过以下测试。
String para = "p=result中文的&s=ad98adj";
byte[] bytes = para.getBytes("GBK");
ByteChunk byteChunk = new ByteChunk();
byteChunk.setBytes(bytes , 0 , bytes.length);
byteChunk.setCharset(Charset.forName("utf-8"));
String receive = byteChunk.toString();//this is the wrong string
//reverse
byteChunk.reset();
bytes = receive.getBytes("GBK");
byteChunk.setBytes(bytes , 0 ,bytes.length);
byteChunk.setCharset(Charset.forName("GBK"));
receive = byteChunk.toString(); //still the wrong string
那么我如何使用单个 spring 启动应用程序来支持 GBK 和 UTF-8 编码请求。
添加CharacterEncodingFilter bean可以解决问题,见表格https://github.com/spring-projects/spring-boot/issues/1182
@Bean
CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
filter.setForceEncoding(true);
return filter;
}
我遇到了类似的问题,发现 Spring Boot 默认启用了 "forceEncoding"。 这会导致每次 filter.
中的请求字符集被覆盖并设置为 UTF-8见Appendix A. Common application properties
关键部分是:
Defaults to true when "force" has not been specified.
所以设置
spring.http.encoding.force=false
或
spring.http.encoding.force-request=false
应该可以解决你的问题,只要请求正确headers。