Wicket9升级后不同setResponsePage调用方式会话过期跳转异常如何解决
问题根因
你遇到的差异是Wicket 1.5到Wicket 9的默认行为变更导致的:
- 调用
setResponsePage(new MyMenuPage(params))时,生成的是有状态的非书签页,会话过期后会直接抛出PageExpiredException,触发你配置的自定义错误页。 - 调用
setResponsePage(MyMenuPage.class)时,生成的是可通过URL直接访问的书签页,Wicket 9默认开启了recreateBookmarkablePagesAfterExpiry配置,会话过期后会尝试直接重建页面实例,不会抛出PageExpiredException。重建过程中会触发你的登录校验逻辑,直接跳转到登录页,自然不会出现会话过期提示。
解决方案
第一步:修改全局配置
在你的应用主类的init()方法中添加如下配置,关闭书签页过期后自动重建的逻辑:
getPageSettings().setRecreateBookmarkablePagesAfterExpiry(false);
该配置调整后,所有页面会话过期时都会统一抛出PageExpiredException,触发你配置的MyErrorPage。
第二步:校验页面状态(可选兜底处理)
如果调整配置后仍然出现不一致的情况,可在MyMenuPage类中重写isStateless()方法,强制页面为有状态,避免Wicket自动将其优化为无状态页面:
@Override public boolean isStateless() { return false; }
第三步:异常优先级校验
确认你的全局安全拦截逻辑(如AuthRoles认证、自定义请求拦截器)的异常处理优先级:确保PageExpiredException的处理早于登录状态校验,避免异常被登录拦截逻辑覆盖。
兜底方案:自定义请求监听器
如果以上配置都不生效,可以实现自定义IRequestCycleListener全局捕获页面过期异常,手动定向到错误页:
getRequestCycleListeners().add(new AbstractRequestCycleListener() { @Override public IRequestHandler onException(RequestCycle cycle, Exception ex) { if (ex instanceof PageExpiredException) { return new RenderPageRequestHandler(new PageProvider(MyErrorPage.class)); } return super.onException(cycle, ex); } });
内容的提问来源于stack exchange,提问作者sushilab
相关产品推荐
相关产品推荐

