我正在实现一个Web服务,该服务部署在Wildfly-15应用程序服务器上。我想让Content-Type
HTTP响应标头包含charset=UTF-8
。这对于客户理解我的回答是必要的。
我的一个客户总是发送其请求而未在Content-Type
中指定字符集。在这种情况下,Wildfly的Web服务堆栈在响应中使用默认的charset=ISO-8859-1
。在underwow code的第602-611行中看到此行为:
private String extractCharset(HeaderMap headers) {
String contentType = headers.getFirst(Headers.CONTENT_TYPE);
if (contentType != null) {
String value = Headers.extractQuotedValueFromHeader(contentType, "charset");
if (value != null) {
return value;
}
}
return ISO_8859_1;
}
因为我的回复实际上是UTF-8
编码的(并且需要如此),所以这会在客户端造成麻烦。请参见undertow日志中的标头转储:
----------------------------REQUEST---------------------------
header=Connection=Keep-Alive
header=SOAPAction=****
header=Accept-Encoding=gzip,deflate
header=Content-Type=text/xml
header=Content-Length=2137
header=User-Agent=Apache-HttpClient/4.1.1 (java 1.5)
header=Host=****
locale=[]
method=POST
....
--------------------------RESPONSE--------------------------
header=Connection=keep-alive
header=Content-Type=text/xml;charset=ISO-8859-1
header=Content-Length=1553
header=Date=Tue, 29 Jan 2019 16:19:38 GMT
status=200
这种响应在IBM Websphere应用程序中导致以下异常:
org.springframework.ws.InvalidXmlException: Could not parse XML; nested exception is org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0xffffffff) was found in the element content of the document.
不幸的是,修改客户端不是一个选择。
到目前为止,我的努力是通过指定过滤器以覆盖HTTP Response标头来配置Widlfy的underwow。在响应标题过滤器的帮助下,我只能设置Content-Encoding
。看来Content-Type
标头已被沿行的其他地方覆盖。
我的第二个猜测是对表达式使用 Expression Filter
header(header=Content-Type, value='text/xml;charset=UTF-8')
不幸的是,它也不起作用。
charset=UTF-8
?