【问题标题】:After Wicket session timeout - pageParameters are null在 Wicket 会话超时后 - pageParameters 为空
【发布时间】:2013-08-30 14:29:42
【问题描述】:

我正在使用检票口 6。

我的应用程序基于在构造函数中使用 pageParameters 创建的 WebPages。我还使用了一个 pageParameter country,它是一个路径参数,定义为:

mountPage("/${country}/pagepath", MyPage.class);

我在每一页都有很多有状态的表单。 我现在正在尝试处理会话过期的情况(为了重现这种情况,我删除或修改了 jsessionid cookie)。 之后,我单击页面中的提交按钮,我希望 wicket 了解会话已过期。 但我的行为是这样的:

  • 当前页面已重新加载,但页面参数为“null”
  • url 使用包符号重写,例如:

    localhost:8080/wicket/bookmarkable/com.test.pages.MyPage
    

所以看起来 url 映射不知何故丢失了。

我需要用 pageParameters 信息重新加载同一页面,或者显示一个信息页面,上面写着“单击此处重新加载”之类的内容。

我已经尝试过使用:

getApplicationSettings().setPageExpiredErrorPage(HomePage.class); 

但这并没有帮助。

感谢任何帮助。谢谢。

【问题讨论】:

    标签: session wicket jsessionid wicket-1.6


    【解决方案1】:

    看起来 Wicket 6 中存在导致此问题的错误:https://issues.apache.org/jira/browse/WICKET-5068

    在 Wicket 7 中已修复。对于 Wicket 6,有一个解决方法:禁用 WICKET-4594 修复。

    首先添加以下映射器:

    public class BookmarkableMapperThatSavesPageParametersForListener extends BookmarkableMapper {
        @Override
        protected PageParameters getPageParametersForListener(PageInfo pageInfo, PageParameters pageParameters) {
            return pageParameters;
        }
    }
    

    然后用它来替换您的Application#init() 中的内置BookmarkableMapper(这必须在使用根映射器进行任何操作之前添加):

    mount(new BookmarkableMapperThatSavesPageParametersForListener());
    

    这种方法在我们的应用程序中有效,并且似乎没有破坏任何东西。

    更多信息:Wicket 6: empty PageParameters when recreating a page after expiration

    【讨论】:

      【解决方案2】:

      您可以在 wicket 邮件列表中提出您的问题。您所观察到的可能是一个错误。请查看PageParameters missing from re-created Page

      从概念上讲,即使您需要经过身份验证的用户会话,也应该可以正常提交表单。 如果会话已过期,那么您可以使用记住我的 cookie 重新创建用户会话。 Wicket 应该使用参数重新构建页面,应用表单值并处理提交。如果页面是有状态的,可能会出现一些可能可以解决的复杂情况。如果您发现有状态页面不支持您的用例,那么您可以提出问题并同时使用 StatelessForm。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 2012-02-17
        相关资源
        最近更新 更多