2013-07-04 62 views
2

我有一個Wicket(6.9.0)應用程序,它在幾頁上接受用戶輸入,處理數據並最終顯示一個頁面,該頁面給出了輸入摘要。應用程序在會話中存儲了一些數據,所以我想最終使其無效,以便用戶無法返回過時的會話數據。如何使Wicket會話無效

我試圖在我的摘要頁面中使用session.invalidate(),首先在構造函數中,然後在onAfterRender()中,但是這兩次我最終都看到「Page Expired」頁面,而不是我的摘要頁面的輸出。

有沒有辦法顯示我的摘要頁面,然後使我的會話失效?或者這是不應該在Wicket中完成的事情?

+0

session.invalidate()不會制動當前頁面呈現,它可能是另一種問題,例如頁面引用無效,延遲加載數據(例如hibernate)或NPE等等。你能提供一個代碼片段嗎? –

+0

除了向頁面添加一些標籤之外,構造函數根本不做任何事情。數據以Java bean的形式出現,因此與類本身之外的任何內容都沒有交互。 –

回答

2

「頁面已過期」問題是由框架的呈現策略引起的。默認情況下,Wicket使用重定向後事件策略來渲染頁面。因此,如果會話在頁面中的某處失效,則以下get-request將始終顯示「Page Expired」消息,因爲會話不再存在。

簡單的解決辦法是改變渲染策略,在應用init方法:

@Override 
protected void init() { 
    super.init(); 
    getRequestCycleSettings().setRenderStrategy(RenderStrategy.ONE_PASS_RENDER); 
} 

這種解決方案的缺點是,它從「雙提交問題」受到當用戶按下刷新按鈕的瀏覽器。

+1

另一個允許我使用默認渲染策略的解決方案是:在最後一頁包含一個AjaxLazyLoadPanel,並在getLazyLoadComponent()方法內部使會話無效。我認爲這樣更好,然後更改爲ONE_PASS_RENDER策略,因爲它不會影響我的應用程序的其餘部分。 –

1

如果您在onAfterRender的構造函數中使會話無效,那麼這是在頁面顯示之前,這就是您看到頁面過期頁面的原因。

,你可以:

+0

感謝Robert的建議。看起來很奇怪,在onAfterRender()之後有任何對會話的引用。 Wicket甚至在渲染頁面後仍然需要它。 –