我需要为我的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响应中包含我的自定义标题 ?
答案 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()。