我正在尝试使用 Wicket 1.5.8 使给定页面的所有先前版本过期。在 wicket 1.4 中,它是由 getPage().getPageMap().clear()
完成的。现在在 wicket 1.5 中,页面 map 不见了,我不知道如何点它。
我的用例是我有一个向导 (http://www.wicket-library.com/wicket-examples/wizard/) 来创建/编辑一个实体。提交向导后,用户将被重定向到实体列表。在这一点上,我不希望用户能够使用浏览器后退按钮返回到向导的状态,因此想要使用向导使以前版本的页面过期(我正在使用 getPageSettings().setRecreateMountedPagesAfterExpiry(true);
所以当用户返回时如果页面过期,挂载的页面将以空白状态重新创建,这正是我想要的)。
环顾四周,我发现可以使用 Session.get().clear();
从 Session 中删除所有页面(我不知道 1.4 版本是否删除了所有页面或只是用于访问 PageMap 的页面的所有版本——这对于多选项卡支持会更好)。但是,使用它只能部分起作用,因为最后一页没有过期。
假设向导挂载在/wizard
,最后重定向到/list
,流程将类似于:/wizard?1
, /wizard?2
, /wizard?3
, /list
.现在,当我使用后退按钮时,/wizard?3
没有过期,尽管 /wizard?1
和 /wizard?2
符合预期. session 清除和发送到列表页面是在向导的onFinish
方法中完成的,如下所示:
@Override
public void onFinish() {
Session.get().clear();
Session.get().getFeedbackMessages().add(new FeedbackMessage(..));
setResponsePage(ListPage.class);
}
那么,回到问题本身:有人知道如何获得预期的行为,即过期 /wizard?3
吗?
谢谢
注意:ListPage
是一个可添加书签的页面,我也尝试使用 setResponsePage(new ListPage());
根据 Andrea 的建议更新我最终所做的
需要注意的是,我的应用程序使用了一个扩展 wicket 的 Session
的自定义 session 对象;我们称它为 AppSession
。
- 在
AppSession
中,我添加了一个boolean clearRequested
属性(默认为 false) - 在
AppSession
中,我添加了一个静态 void 方法requestClear()
,它只是在 session 中将 clearRequested 设置为 true 的快捷方式 - 在我的向导的
onFinish()
中,就在调用setResponsePage
之前,我调用了AppSession.requestClear()
最后,我只是将
RequestCycleListener
添加到我的应用程序中。getRequestCycleListeners.add(new AbstractRequestCycleListener() { @Override public void onBeginRequest(RequestCycle cycle) { super.onBeginRequest(cycle); AppSession session = AppSesssion.get(); if (session.isClearRequested()) { session.clear(); session.setClearRequested(false); } } });
现在每当我需要在操作后清除 session 以使页面过期时,我只需调用 AppSession.requestClear()
并在下一个请求中清除 session 。
最佳答案
您可以清除 ListPage 中的 session 。由于此页面是可 Collection 的,您可以向它传递一个页面参数,指示 ListPage 必须摆脱 session 中的页面。
关于java - 在 wicket 1.5.8 中强制页面过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12801761/