【问题标题】:How to set custom HTTP response header in Wicket's Ajax responses?如何在 Wicket 的 Ajax 响应中设置自定义 HTTP 响应标头?
【发布时间】:2013-07-19 18:20:48
【问题描述】:

我需要为来自我的 Wicket 应用程序的所有响应设置一个自定义 HTTP 标头。我目前正在自定义 RequestCycle 中执行此操作,其中 getWebResponse() 沿这些行被覆盖:

@Override
public WebResponse getWebResponse() {
    WebResponse response = super.getWebResponse();
    response.setHeader("X-custom", "..." );
    return response;
}

这很好,直到现在我已经切换到使用 AjaxCheckBox (something like this) 而不是普通的 CheckBox 来进行某些配置选项。

我的问题是,有没有一种简单的方法可以在 Wicket 的 Ajax 响应中包含我的自定义标头

【问题讨论】:

  • 注意:标头值是动态的,来自域对象(最终来自数据库)。如果可能的话,我宁愿 在 Wicket 内 这样做,而不是使用普通的(Java EE)过滤器或其他东西。
  • 我一开始忘记提及的另一个限制:有问题的 Ajax 请求会导致数据库中的值发生更改,并且自定义标头应该精确地包含该 updated 值。 (这是一种序列号,当某些事情发生变化时会增加,并且标题将其传递给另一个合作软件。)我很容易承认这可能不是 Wicket 应用程序或任何其他应用程序的非常典型的要求网络应用程序。 :)

标签: java ajax http-headers wicket


【解决方案1】:

我找到了办法。最后,其实一点都不难。当使用我的调试器运行一些请求时,我注意到 onEndRequest() 确实也会被调用来处理 Ajax 请求

onEndRequest() 方法已经在我们的自定义 RequestCycle 实现中被覆盖用于其他目的(事务提交),所以我只是将设置标头的代码从 getWebResponse() 移到那里。

@Override
protected void onEndRequest() {
    super.onEndRequest();
    ((WebResponse) response).setHeader("X-custom", "..." );
    // ...
}

也许这里唯一不明显的事情是我需要将response 转换为WebResponse(当字段类型为Response 时)才能调用setHeader()

这也可以在normal Java EE filter 中完成,方法是设置标题after chain.doFilter() 调用(请参阅我对该问题的第二条评论)。我没有选择那个,因为1)我不清楚如何在那里连接数据访问,2)如果可以避免的话,我不想要额外的移动部件。我们已经使用我们的 RequestCycle 子类来处理与 HTTP 标头相关的事情,这非常适合。事实上,这种变化简化了该类,因为没有理由再覆盖 getWebResponse()

【讨论】:

    【解决方案2】:

    在底层,Wicket 仍然使用标准的 Java HTML 堆栈。因此,不要覆盖现有方法,只需实现 Filter 并将其注册到您的 web.xml 中。使用正确的 URL 模式,它将适用于所有请求,无论是谁处理它们。

    【讨论】:

    • 啊,谢谢,我刚刚在问题的评论中添加了更多细节。当然,如果没有其他方法,我需要添加一个过滤器并以某种方式连接我的数据访问对象。 (或者然后在这种情况下切换回正常的 CheckBox,因为我只想让它快速再次工作......)
    【解决方案3】:

    看AjaxRequestTarget的实现

    [...]

    /**
     * @see org.apache.wicket.IRequestTarget#respond(org.apache.wicket.RequestCycle)
     */
    public final void respond(final RequestCycle requestCycle)
    {
        final WebResponse response = (WebResponse)requestCycle.getResponse();
    
        if (markupIdToComponent.values().contains(page))
    

    [...]

    Wicket 解决方案是改写 RequestCycle.getResponse()。

    【讨论】:

    • 嗯,RequestCycle.getResponse() 是最终的,但你不能这样做。 ://
    • 嗯....,真的。我会说它是 AjaxRequestTarget 中的一个错误。至少可以提交问题:issues.apache.org/jira/browse/WICKET-3251
    • 谢谢... 嗯,我不知道这是否是 Wicket 错误,但我找到了一种简单的方法让它工作,在 Wicket 和所有内部!见this answer
    • 我没有 ASF Jira 帐户,您能否提及我在评论中找到的解决方案? (当然,如果您认为它完全相关。)
    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 2020-02-09
    • 2015-03-12
    • 2016-12-21
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多