繁体   English   中英

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

[英]How to set custom HTTP response header in Wicket's Ajax responses?

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

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

这一直很好,直到现在我已将某些配置选项切换为使用AjaxCheckBox( 类似这样的东西 ),而不是普通的CheckBox。

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

我找到了一个方法。 最后,实际上一点也不难。 当使用调试器运行某些请求时,我注意到onEndRequest()请求也确实调用了onEndRequest()

我们的自定义RequestCycle实现中onEndRequest()方法用于其他目的(事务提交),因此我刚刚从getWebResponse()移动了用于设置标头的代码。

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

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

通过 chain.doFilter()调用之后设置标头,也可以在普通的Java EE过滤器中完成此操作(请参阅我对该问题的第二条评论)。 我之所以没有选择它,是因为1)我不清楚如何在那儿进行数据访问,以及2)如果可以避免的话,我不需要多余的活动部件。 我们已经将我们的RequestCycle子类用于HTTP标头相关的事情,这很合适。 实际上,此更改简化了该类,因为不再需要重写getWebResponse()了!

在后台,Wicket仍然使用标准的Java HTML堆栈。 因此,与其覆盖现有方法,不如实现一个Filter并将其注册到您的web.xml 使用正确的URL模式,它将适用于所有请求,而不管是谁处理的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM