在Wicket 9中的java中,当用户的会话在某些页面中过期时,它们将被重定向到登录页面,而不是会话过期页面
在将一些遗留代码从Wicket 1.5升级到Wicket 9的过程中,我发现重定向到“会话已过期”通知页面似乎部分中断
在主应用程序文件中,我有以下声明,以前总是这样:
getApplicationSettings().setPageExpiredErrorPage(MyErrorPage.class);
下面是应该触发重定向到“MyErrorPage”的场景:
- 用户成功登录并进入任何菜单选项李>
- 他们闲坐了一会儿,什么也不做,会议就结束了李>
- 在这段时间不活动后,他们单击链接或尝试提交表单李>
- 此时,应该将它们重定向到“MyErrorPage”李>
在第(1)点中调用的菜单选项(我们称之为MyMenuPage)可以使用两种可能的语法类型调用: 要么:
setResponsePage(MyMenuPage.class);
或:
setResponsePage(new MyMenuPage(params));
似乎只有在使用第二种语法调用原始菜单页面时,用户才会重定向到我的自定义错误页面
如果使用第一种语法调用了原始页面,那么用户将直接被发送到登录页面,而不会解释其页面已过期的事实
请有人告诉我如何在这两种类型的页面中获得相同的结果-这不是无状态的,因为用户已登录
# 1 楼答案
似乎我必须通过始终使用以下语法来解决这个问题:
这并不是世界末日,因为至少我不需要传入任何参数,就可以触发所需的“转到会话过期页面”行为
# 2 楼答案
页面过期和http会话过期之间存在差异
正如PageExpiredException的javadoc[I]所解释的,有三个可能的原因:
Wicket将所有有状态页面存储在磁盘上。稍后,当您使用此类页面时,例如通过单击链接,Wicket将加载页面实例,执行单击,并呈现响应
如果http会话已过期,则很可能您的身份验证策略会启动,并重定向到登录页面,甚至不尝试加载旧页面。如果在成功登录后使用
Component#continueToOriginalDestination()
,用户将被导航到旧页面的新实例总结一下:
PageSettings#setRecreateBookmarkablePagesAfterExpiry(boolean)
),或显示已配置的getApplicationSettings().setPageExpiredErrorPage(MyPage.class);
将被呈现要调试您的情况,请在以下位置设置一些断点:
一https://github.com/apache/wicket/blob/master/wicket-core/src/main/java/org/apache/wicket/protocol/http/PageExpiredException.java#L31