有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Wicket 9中的java中,当用户的会话在某些页面中过期时,它们将被重定向到登录页面,而不是会话过期页面

在将一些遗留代码从Wicket 1.5升级到Wicket 9的过程中,我发现重定向到“会话已过期”通知页面似乎部分中断

在主应用程序文件中,我有以下声明,以前总是这样:

getApplicationSettings().setPageExpiredErrorPage(MyErrorPage.class);

下面是应该触发重定向到“MyErrorPage”的场景:

  1. 用户成功登录并进入任何菜单选项
  2. 他们闲坐了一会儿,什么也不做,会议就结束了
  3. 在这段时间不活动后,他们单击链接或尝试提交表单
  4. 此时,应该将它们重定向到“MyErrorPage”

在第(1)点中调用的菜单选项(我们称之为MyMenuPage)可以使用两种可能的语法类型调用: 要么:

setResponsePage(MyMenuPage.class);

或:

setResponsePage(new MyMenuPage(params));

似乎只有在使用第二种语法调用原始菜单页面时,用户才会重定向到我的自定义错误页面

如果使用第一种语法调用了原始页面,那么用户将直接被发送到登录页面,而不会解释其页面已过期的事实

请有人告诉我如何在这两种类型的页面中获得相同的结果-这不是无状态的,因为用户已登录


共 (2) 个答案

  1. # 1 楼答案

    似乎我必须通过始终使用以下语法来解决这个问题:

    setResponsePage(new MyPage());
    

    这并不是世界末日,因为至少我不需要传入任何参数,就可以触发所需的“转到会话过期页面”行为

  2. # 2 楼答案

    页面过期和http会话过期之间存在差异

    正如PageExpiredException的javadoc[I]所解释的,有三个可能的原因:

    • 页面从未存储在那里,例如,存储过程中发生错误
    • http会话已过期,因此与此会话相关的所有页面也将被删除
    • 页面实例已被删除,因为超出了存储大小

    Wicket将所有有状态页面存储在磁盘上。稍后,当您使用此类页面时,例如通过单击链接,Wicket将加载页面实例,执行单击,并呈现响应

    如果http会话已过期,则很可能您的身份验证策略会启动,并重定向到登录页面,甚至不尝试加载旧页面。如果在成功登录后使用Component#continueToOriginalDestination(),用户将被导航到旧页面的新实例

    总结一下:

    • 如果http会话过期,那么应用程序将重定向到登录页面
    • 如果页面实例已过期,则默认情况下,Wicket将为其创建一个新实例(请参见PageSettings#setRecreateBookmarkablePagesAfterExpiry(boolean)),或显示已配置的getApplicationSettings().setPageExpiredErrorPage(MyPage.class);将被呈现

    要调试您的情况,请在以下位置设置一些断点:

    1. https://github.com/apache/wicket/blob/6a7e4c3d770324f125fbf43615c7708b67c8d8c5/wicket-core/src/main/java/org/apache/wicket/Component.java#L1061
    2. https://github.com/apache/wicket/blob/6a7e4c3d770324f125fbf43615c7708b67c8d8c5/wicket-auth-roles/src/main/java/org/apache/wicket/authroles/authentication/AuthenticatedWebApplication.java#L134

    https://github.com/apache/wicket/blob/master/wicket-core/src/main/java/org/apache/wicket/protocol/http/PageExpiredException.java#L31