如何在Wicket的Ajax响应中设置自定义HTTP响应头?

时间:2010-12-09 10:30:32

标签: java ajax http-headers wicket

我需要为我的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响应中包含我的自定义标题

3 个答案:

答案 0 :(得分:3)

我发现了一种方法。最后,它实际上并不难。使用我的调试器运行某些请求时,我注意到 onEndRequest() 也会调用Ajax请求

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

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

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

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

答案 1 :(得分:1)

在幕后,Wicket仍然使用标准的Java HTML堆栈。因此,不要覆盖现有方法,只需实施Filter并在web.xml中注册即可。使用正确的URL模式,无论谁处理它们,它都将应用于所有请求。

答案 2 :(得分:0)

查看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()。