在將一些遺留代碼從 Wicket 1.5 升級到 Wicket 9 時,我發現重定向到“會話已過期”通知頁面似乎部分中斷。
我在主應用程式檔案中有以下陳述句,以前總是使用它:
getApplicationSettings().setPageExpiredErrorPage(MyErrorPage.class);
這是應該觸發重定向到“MyErrorPage”的場景:
- 用戶成功登錄并進入任何選單選項。
- 他們坐了一會兒,什么都不做,他們的會話超時了。
- 在這段不活動期之后,他們會單擊鏈接或嘗試提交表單。
- 此時,它們應該被重定向到“MyErrorPage”。
在點 (1) 中呼叫的選單選項 - 讓我們稱之為 MyMenuPage - 可以用兩種可能的語法型別呼叫:
setResponsePage(MyMenuPage.class);
或者:
setResponsePage(new MyMenuPage(params));
如果使用 SECOND 語法呼叫原始選單頁面,則似乎用戶只會被重定向到我的自定義錯誤頁面。
如果原始頁面是使用 FIRST 語法呼叫的,則用戶會直接進入登錄頁面,而不會對其頁面已過期這一事實進行任何解釋。
請有人告訴我如何在兩種型別的頁面中獲得相同的結果 - 這不是無狀態的,因為用戶已登錄。
uj5u.com熱心網友回復:
頁面過期和 http 會話過期之間存在差異。
正如 PageExpiredException 的 javadoc [I] 解釋的那樣,可能有以下三種原因:
- 該頁面從未存盤在那里,例如在存盤程序中發生錯誤
- http 會話已過期,因此與此會話相關的所有頁面也被洗掉
- 由于超出存盤大小,頁面實體已被擦除
Wicket 將所有有狀態的頁面存盤在磁盤上。稍后當您使用此類頁面時,例如通過單擊鏈接,Wicket 加載頁面實體、執行單擊并呈現回應。
如果 http 會話過期,那么您的身份驗證策略很可能會啟動并重定向到登錄頁面,甚至無需嘗試加載舊頁面。如果您Component#continueToOriginalDestination()在成功登錄后使用,那么用戶將被導航到舊頁面的新實體。
總結一下:
- 如果 http 會話過期,則您的應用程式重定向到 LoginPage
- 如果頁面實體已過期,則默認情況下 Wicket 將創建它的新實體(請參閱
PageSettings#setRecreateBookmarkablePagesAfterExpiry(boolean))或顯示配置getApplicationSettings().setPageExpiredErrorPage(MyPage.class);將被呈現
要除錯在您的情況下發生的情況,請在以下位置放置一些斷點:
- https://github.com/apache/wicket/blob/6a7e4c3d770324f125fbf43615c7708b67c8d8c5/wicket-core/src/main/java/org/apache/wicket/Component.java#L1061
- https://github.com/apache/wicket/blob/6a7e4c3d770324f125fbf43615c7708b67c8d8c5/wicket-auth-roles/src/main/java/org/apache/wicket/authroles/authentication/Authenticated1WebApplication.java#L
一、https://github.com/apache/wicket/blob/master/wicket-core/src/main/java/org/apache/wicket/protocol/http/PageExpiredException.java#L31
uj5u.com熱心網友回復:
似乎我只需要始終使用以下語法來解決這個問題:
setResponsePage(new MyPage());
這不是世界末日,因為至少我不必傳入任何引數來觸發所需的“轉到會話過期頁面”行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/331199.html
