1

当请求的响应包含货币符号(在本例中为“£”)时,我在请求的响应中遇到损坏的 XML。

我已经做了很多测试,并将其范围缩小到在 XML 中使用“£”,这会以某种方式导致不完整的结束标记,这当然会导致无法解析的 XML,例如:

<?xml version='1.0' encoding='UTF-8'?>
<partial-response>
<changes>
<update id="productForm">
<![CDATA[
<form enctype="application/x-www-form-urlencoded">
    <div>
         <span>
             <span id="productForm:price">£10.00</span>
         </span>
    </div>
</form>]]>
</update>
</changes>
</partial-response

这是由于partial-response在开发控制台中确认的结束标记损坏(不是拼写错误): 在此处输入图像描述

£正如调试和测试所确定的那样, 存在的就是原因。

以下是我可以做出的一些断言:

  • 受影响的代码在 Java 7/Glassfish 3 上运行良好
  • 相同的代码在 Java 8/Wildfly 17上不起作用,除非£符号被省略,此时它是 BAU
  • 货币符号已尝试使用:

    • <f:convertNumber type="currency" locale="en_GB" currencyCode="GBP"/>
    • <f:convertNumber type="currency" locale="en_GB" currencySymbol="&#163;"/> 所有这些都失败了。
    • <f:convertNumber type="currency" locale="en_GB" pattern="0.00"/>没有,但显然因为它没有以£
  • 删除 XHTML 模板的所有其余部分并简单地添加<p>&#163;</p>也会使其变得糟糕。

我看不到任何明显的原因 - 我也无法确定它是应用程序服务器还是应用程序配置问题。它已经在 *NIX 环境中进行了测试,在这方面没有任何迹象表明它是环境的。

我在这里有什么明显的遗漏吗?我能看到的所有编码都设置为UTF-8,所以我被这个难住了,通过搜索找不到其他类似的情况。

感谢您提前提出任何建议

4

1 回答 1

2

经过进一步调查,发现这是 a 的(未确定的)结果@WebFilter

Web 过滤器实现截获输出字符串中的某些值,尽管实际上并未更改请求的内容,尤其是在调试器中,但这似乎会导致响应进一步出现问题。

网络过滤器中代码的问题区域是:

servletResponse.setContentLength( filteredContent.length() );

我没有编写有问题的类,并且怀疑它可能是“模板代码”,但是重新设置属性似乎导致的问题远远多于它解决的问题。删除它解决了这个问题。看来 servlet 能够自行处理此属性(至少等待更多测试)。

于 2020-04-08T14:47:53.793 回答