Java 如何在Wicket';什么是Ajax响应?

Java 如何在Wicket';什么是Ajax响应?,java,ajax,http-headers,wicket,Java,Ajax,Http Headers,Wicket,我需要为来自Wicket应用程序的所有响应设置一个自定义HTTP头。我目前正在自定义RequestCycle中执行此操作,其中getWebResponse()被以下代码覆盖: @Override public WebResponse getWebResponse() { WebResponse response = super.getWebResponse(); response.setHeader("X-custom", "..." ); return response

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

@Override
public WebResponse getWebResponse() {
    WebResponse response = super.getWebResponse();
    response.setHeader("X-custom", "..." );
    return response;
}
这非常有效,直到现在,对于某些配置选项,我已经切换到使用AjaxCheckBox()而不是普通的CheckBox


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

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

查看AjaxRequestTarget的实现

[……]

[……]


Wicket的解决方案是覆盖RequestCycle.getResponse()。

我找到了一种方法。最后,这其实一点也不难。在使用我的调试器运行一些请求时,我注意到,
onEndRequest()
也会被Ajax请求调用

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

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


这也可以通过在
chain.doFilter()
call之后设置标题来实现(请参阅我对该问题的第二条评论)。我没有选择这样做,因为1)我不清楚如何连接那里的数据访问,2)如果可以避免的话,我不想要额外的运动部件。我们已经将RequestCycle子类用于与HTTP头相关的事情,这非常适合。事实上,这个更改简化了这个类,因为没有理由再重写
getWebResponse()

注意:头值是动态的,来自域对象(最终来自数据库)。如果可能的话,我更愿意在Wicket内部执行此操作,而不是使用普通的(JavaEE)过滤器或其他东西。我一开始忘记提到的另一个限制是:所讨论的Ajax请求会导致数据库中的值发生更改,自定义头应该正好包含更新后的值。(这是一种序列号,当某些事情发生变化时,序列号会增加,标题会将其传递给另一个合作软件。)我承认这可能不是Wicket应用程序或任何Web应用程序的典型要求。:)啊,谢谢,我只是在对问题的评论中补充了更多细节。当然,如果没有其他方法,我需要添加一个过滤器,并以某种方式在那里连接我的数据访问对象。(或者在这种情况下只需切换回正常复选框,因为我只想让它快速恢复工作…)嗯,
RequestCycle.getResponse()
是最终选项,所以您不能这样做:/嗯…,没错。我认为这是AjaxRequestTarget中的一个bug。至少很好地提出了一个问题:谢谢。。。嗯,我不知道这是不是一个Wicket bug,但我找到了一个简单的方法让它工作,在Wicket内部和所有!看,我没有ASF Jira的账户,所以你能提到我在评论中找到的解决方案吗?(当然,如果你认为这是相关的。)
/**
 * @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))
@Override
protected void onEndRequest() {
    super.onEndRequest();
    ((WebResponse) response).setHeader("X-custom", "..." );
    // ...
}