You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:39:02