为什么 Adobe 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\">"}
- 这是怎么回事?
- 我该怎么做才能为调试帮助提供更好的信息?我所知道的是我们的 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。您将避免多余的空格、转义问题以及 - 最后但并非最不重要的 - 小脚本。
我的网站上有一个错误,似乎与 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\">"}
- 这是怎么回事?
- 我该怎么做才能为调试帮助提供更好的信息?我所知道的是我们的 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。您将避免多余的空格、转义问题以及 - 最后但并非最不重要的 - 小脚本。