为什么 Wicket 在 tomcat 重新启动后重定向到主页?

Why Wicket redirects to the home page after tomcat restarting?

假设我的应用程序中有三个页面:SignInPage、HomePage 和 AnotherPage。 当我第一次打开应用程序时,它会显示 SignInPage。授权后,它会将我重定向到主页。之后,我手动打开 AnotherPage,重新启动 servlet 容器,然后按 F5 按钮。 wicket 再次将我重定向到 HomePage,而不是 AnotherPage。为什么会发生这种情况以及如何避免这种情况?

--

所有页面都使用 mountPage 方法装载。每个页面都是有状态的,并且有 @AuthorizeInstantiation 注释。应用程序 class 扩展了 AuthenticatedWebApplication 并覆盖了如下方法:

@Override
protected Class<? extends WebPage> getSignInPageClass() {
    return SignInPage.class;
}

@Override
public Class<? extends Page> getHomePage() {
    return HomePage.class;
}

此外,在配置中我有以下行:

getApplicationSettings().setPageExpiredErrorPage(ErrorSessionExpiredPage.class);

(但我从未见过打开此页面)

更新:

解决方法是在SignInPage中添加如下代码class:

@Override
protected void onBeforeRender() {
    if (((AuthenticatedWebSession)Session.get()).isSignedIn()) {
        continueToOriginalDestination();
        setResponsePage(Application.get().getHomePage());
    }
    super.onBeforeRender();
}

重新启动 servlet 容器会为您提供新会话,但不会提供哪些页面已过期的信息,因此这就是您被重定向到主页的原因。

请检查:https://users.wicket.apache.narkive.com/3OtYz8xj/pageexpiredexception-not-working-on-session-expired-wicket-1-5-11

当您重新启动 servlet 容器时,它会丢失所有会话。在下一个请求中,Wicket 检测到这是一个新的 http 会话,应该将您重定向到 SignInPage,而不是直接到 HomePage。只有在成功验证后,您才能看到主页。

如果您使用Component#redirectToInterceptPage(Page) + Component.continueToOriginalDestination(),那么您可以在验证成功后登陆AnotherPage。有关详细信息,请参阅 Component.continueToOriginalDestination() 的 javadoc。