为什么Adobe CQ 5.6.1会改变我的JSON输出?

时间:2015-01-13 23:16:31

标签: jsp servlets cq5 aem

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

用例只是使用.json.jsp输出JSON对象/哈希,并在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日的生产中,但即使我使用几个月前的代码,问题再现了)。

1 个答案:

答案 0 :(得分:2)

您的输出已由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和一些JSON库(例如GSON)而不是JSP。你将避免多余的空白区域,逃避问题,最后但并非最不重要的是,小程序。