Utf 8 REST Spring引导控制器中请求头的编码

Utf 8 REST Spring引导控制器中请求头的编码,utf-8,character-encoding,spring-boot,http-headers,iso-8859-1,Utf 8,Character Encoding,Spring Boot,Http Headers,Iso 8859 1,TLDR 若应用程序的默认字符集为UTF-8,则在调用控制器方法时,某些UTF-8头会被编码两次。 SpringMVC在哪里处理编码以及如何控制它 详细信息 REST控制器中的标头值存在以下问题 我们使用一个SSO服务作为代理,并向请求中注入一些额外的头。注入的值是mail、givenname、lastname等 代理在标头中注入UTF-8编码值(我们已与tcpdump和wireshark进行了检查) 我们的控制器就像这个 @RestController @RequestMapping("/ap

TLDR

若应用程序的默认字符集为UTF-8,则在调用控制器方法时,某些UTF-8头会被编码两次。 SpringMVC在哪里处理编码以及如何控制它

详细信息

REST控制器中的标头值存在以下问题

我们使用一个SSO服务作为代理,并向请求中注入一些额外的头。注入的值是mail、givenname、lastname等

代理在标头中注入UTF-8编码值(我们已与tcpdump和wireshark进行了检查)

我们的控制器就像这个

@RestController
@RequestMapping("/api/v1/foo")
public class FooController {

@RequestMapping("/bar")
public ResponseEntity<List<String>> bar(@RequestHeader("foo") String foo, @RequestHeader("givenname") String firstname) throws UnsupportedEncodingException {
    ArrayList<String> list = Lists.newArrayList(
        "FOO:                                  " + foo,
        "CHARSET:                              " + Charset.defaultCharset().name(),
        "FOO WITH DEFAULT CHARSET:             " + asHexList(foo),
        "FOO WITH UTF8:                        " + asHexList(new String(foo.getBytes("UTF-8"))),
        "INJECTED HEADER WITH DEFAULT CHARSET: " + asHexList(firstname),
        "INJECTED HEADER WITH UTF8:            " + asHexList(new String(firstname.getBytes("UTF-8")))
      );
    return ResponseEntity.ok( list  );
  }
}    
/**
  * Print a concatenated list of hexa représentation of the string's bytes
  * assert asHexList(new String("é", "UTF-8"))equals("c3 e9")
  * @param String s
  * @return String 
*/
public String asHexList(String s) {...}
当LANG是fr_fr.UTF-8时,我们有

[
"FOO:                                 Gérard",
"CHARSET:                              UTF-8",
"FOO WITH DEFAULT CHARSET:             47 c3 a9 72 61 72 64",
"FOO WITH UTF8:                        47 c3 a9 72 61 72 64",
"INJECTED HEADER WITH DEFAULT CHARSET: 47 c3 83 c2 a9 72 61 72 64",
"INJECTED HEADER WITH UTF8:            47 c3 83 c2 a9 72 61 72 64"
]
我们可以看到

  • 当应用程序的字符集为“ISO-8859-1”时,自定义头('foo')编码为“ISO-8859-1”(é=>e9),注入头编码为“UTF-8”(é=>c3 a9)
  • 当应用程序的字符集为“UTF-8”时,自定义头('foo')编码为“UTF-8”(é=>c3 a9),注入头编码为“UTF-8”两次(é=>c3 a9=>c3 83 c2 a9)
SpringMVC在哪里处理编码以及如何控制它? Spring中LANG、file.enconding和默认字符集之间的关系是什么

我们在1.3.3.0版本的spring引导中嵌入了SpringWeb4.2.5版本

非常欢迎你的帮助

[
"FOO:                                 Gérard",
"CHARSET:                              ISO-8859-1",
"FOO WITH DEFAULT CHARSET:             47 e9 72 61 72 64",
"FOO WITH UTF8:                        47 c3 a9 72 61 72 64",
"INJECTED HEADER WITH DEFAULT CHARSET: 47 c3 a9 72 61 72 64",
"INJECTED HEADER WITH UTF8:            47 c3 83 c2 a9 72 61 72 64"
]
[
"FOO:                                 Gérard",
"CHARSET:                              UTF-8",
"FOO WITH DEFAULT CHARSET:             47 c3 a9 72 61 72 64",
"FOO WITH UTF8:                        47 c3 a9 72 61 72 64",
"INJECTED HEADER WITH DEFAULT CHARSET: 47 c3 83 c2 a9 72 61 72 64",
"INJECTED HEADER WITH UTF8:            47 c3 83 c2 a9 72 61 72 64"
]