【问题标题】:How to invalidate Wicket session如何使 Wicket 会话无效
【发布时间】:2013-07-04 15:53:13
【问题描述】:

我有一个 Wicket (6.9.0) 应用程序,它在几个页面上接受用户输入、处理数据并最终显示一个提供输入摘要的页面。该应用程序在会话中存储了一些数据,因此我希望最终使其无效,这样用户就无法返回并继续使用陈旧的会话数据。

我尝试在我的摘要页面中使用 session.invalidate(),首先在构造函数中,然后在 onAfterRender() 中,但两次我最终都看到“页面已过期”页面,而不是我的摘要页面的输出。

有没有办法显示我的摘要页面然后使我的会话无效?或者这是在 Wicket 中不应该做的事情?

【问题讨论】:

  • session.invalidate() 不会中断当前页面的渲染,这可能是另一种问题,例如页面引用无效,延迟加载数据(例如休眠)或 NPE 或诸如此类在。可以给个代码sn-p吗?
  • 构造函数什么都不做,除了给页面添加一些标签。数据以 Java bean 的形式出现,因此与类本身之外的任何东西都没有交互。

标签: session wicket invalidation


【解决方案1】:

“页面过期”问题是由框架的渲染策略引起的。默认情况下,Wicket 使用发布后重定向策略来呈现页面。因此,如果会话在页面中的某处失效,则以下 get-request 将始终显示“页面已过期”消息,因为会话不再存在。

简单的解决方法是在Application init方法中改变渲染策略:

@Override
protected void init() {
   super.init();
   getRequestCycleSettings().setRenderStrategy(RenderStrategy.ONE_PASS_RENDER);
}

此解决方案的缺点是当用户按下浏览器上的刷新按钮时会出现“双重提交问题”。

【讨论】:

  • 另一个允许我使用默认渲染策略的解决方案:在最后一页包含一个 AjaxLazyLoadPanel 并使 getLazyLoadComponent() 方法中的会话无效。我认为这比更改为 ONE_PASS_RENDER 策略更好,因为它不会影响我的应用程序的其余部分。
【解决方案2】:

如果您在 onAfterRender 的构造函数中使会话无效,那么这是在页面显示之前,这就是您看到 Page Expired Page 的原因。

你可以:

【讨论】:

  • 感谢罗伯特的建议。在 onAfterRender() 之后对会话有任何引用似乎很奇怪。不知何故,即使在呈现页面之后,Wicket 仍然需要它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 2014-02-25
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多