【问题标题】:Setting a response header in a CQ5 publishing instance在 CQ5 发布实例中设置响应标头
【发布时间】:2013-01-09 15:25:27
【问题描述】:

我想禁用 CQ 组件中的缓存,我的 jsp (documentation) 中有以下行:

response.setHeader("Dispatcher", "no-cache");

如果我将组件插入页面并将页面加载到创作实例中,一切都会按预期工作,我会得到一个名为 Dispatcher 的 HTTP 标头,内容为 no-cache

现在,如果我在发布实例上执行相同操作(与 CQ_RUNMODE='publish' 和相同内容的相同配置)组件可以工作,但用于设置 HTTP 标头。

知道为什么这两个实例的行为会不同吗?

更新

我尝试设置其他标头,但实例的行为方式相同:在创作模式下,标头不是在发布模式下生成的(相同的配置,但针对 CQ_RUNMODE

更新 2

我试图通过从页面中删除所有不必要的内容(布局、页眉代码、页脚......)来减少我的示例,我注意到在一定大小阈值之后我的页眉会正确生成。

换句话说,通过从页面中删除内容(甚至是简单的 HTML),我到达了出现标题的某个点(如果页面足够小)。

知道为什么 CQ 只为非常小的页面生成标题吗?

【问题讨论】:

  • 也许这是一个太明显的建议——但是您的注入标头的代码是否有可能包含在某种 <c:if test="${ global['wcmmode'] eq 'EDIT'}"> 测试中?
  • @DavidGorsline 感谢您的建议。我检查了代码,没有条件。 setHeader 之前和setHeader 之后的语句正确执行。
  • 关于您的更新 2,我怀疑页面大小会有所不同 - 当您删除某个组件(包含的脚本等)时,标题再次起作用的可能性更大。
  • @BertrandDelacretaz 不,我只是删除了一个简单的 HTML 行(甚至是一个段落),然后标题重新出现。我还看到有关丢失块的错误。只要页面小于 HTTP 块,它就可以工作。

标签: aem


【解决方案1】:

如果您尝试在页面下方的组件中设置标题,您可能会遇到在response has been committed 之后尝试编写标题的问题。

如果您需要将页面标记为未缓存并且无法避免将代码放在缓冲区中的较高位置,则可以改为在 JSP 的开头写入对该节点类型的检查(例如使用 node.listChildren()) ,或者提供一个页面属性,让编辑器控制页面是否被缓存。

【讨论】:

  • 谢谢,确实是问题所在。我有时能够获得标题,因为页面足够小,以至于在添加标题时尚未提交响应。分块问题仍然存在,但不相关。
  • 如果刷新缓冲区太快,您可以通过将 buffer="x" 添加到 jsp 页面指令来控制缓冲区大小。让它太大可能会导致可伸缩性问题。您需要在第一个调用的 JSP 上执行此操作,即最顶层的组件。
【解决方案2】:

您没有指明您使用的是哪个版本的 CQ5 - 我只是在 CQ 5.5 GA 发布实例上使用最小 JSP 脚本进行了测试,并且标头设置正确:

$ curl -u admin:admin http://localhost:4503/tmp/x.tidy.json
{
  "sling:resourceType": "x",
  ...
}

$ curl -u admin:admin http://localhost:4503/apps/x/x.jsp
<%
response.setHeader("Dispatcher","no-cache");
%>
Here's the content.

$ curl -D - -u admin:admin http://localhost:4503/tmp/x.html
HTTP/1.1 200 OK
Connection: Keep-Alive
...
Dispatcher: no-cache

Here's the content.

您可能想从这个最小的测试开始,并与您正在做的事情进行比较。

【讨论】:

    猜你喜欢
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多