[英]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.