簡體   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