为什么 Adob​​e CQ 5.6.1 会更改我的 JSON 输出?

Why is Adobe CQ 5.6.1 changing my JSON output?

我的网站上有一个错误,似乎与 CQSE(Adobe AEM/CQ 5.6.1 中的 Servlet 引擎 运行)如何在 JSP 中输出内容有关。

用例只是使用 .json.jsp 输出 JSON object/hash,在 JSON 值中有一些 HTML 片段。

这是一个 JSP 的例子,它给我带来了意想不到的结果:

<%@include file="/libs/foundation/global.jsp"%>
<%
    response.setHeader("Content-Type", "text");
%>
{"key":"<img src=\"/a/b/c/d/e/f/g/h/i.j.40.40.png\">"}

当我在本地主机上点击 URL 时得到的是:

{"key":"<img src="\">"}

当然,我在 Tomcat 中对其进行了测试,以确保它不是某些 JSP 规格的东西,并得到:

{"key":"<img src=\"/a/b/c/d/e/f/g/h/i.j.40.40.png\">"}
  1. 这是怎么回事?
  2. 我该怎么做才能为调试帮助提供更好的信息?我所知道的是我们的 Maven pom.xml 没有指定特定的版本号(我认为这是......不好,对吧?)所以我想在过去的两周里发生了一些变化(我们知道直到 2015 年 1 月 8 日,它才在生产中运行,但即使我使用几个月前的代码,问题也会重现)。

您的输出已被 Sling rewriter 更改 - 您可以通过将 /libs/cq/config/rewriter/default/enabled 属性 设置为 false 来确认这一点。此重写器解析 CQ 生成的所有 HTML 页。您的输出不是常规的 HTML,因此可能存在一些导致无效输出的解析错误。

重写器应该只影响内容类型为 text/html 的响应,因此将其更改为 text 或更好的 application/json 应该可以修复它。只需使用 setContentType 方法而不是 setHeader:

response.setContentType("application/json");

此外,考虑使用 Sling servlet bound to the component resource type and some JSON library (eg. GSON) 而不是 JSP。您将避免多余的空格、转义问题以及 - 最后但并非最不重要的 - 小脚本。