[英]How to intercept custom HTTP header value and store it in Wicket's WebSession?
[英]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.