如何通过配置underwow来设置特定的(内容类型)HTTP响应标头?

时间:2019-01-30 11:00:43

标签: wildfly undertow

摘要

我正在实现一个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')

不幸的是,它也不起作用。

问题

  • 可以通过配置undertow解决此问题吗?
  • 还是我应该以某种方式(如何?)以编程方式将HTTP响应标头设置为包含charset=UTF-8

0 个答案:

没有答案