【问题标题】:Wicket - refresh component on evry Request (implementing session timeout countdown)Wicket - 在每个请求上刷新组件(实现会话超时倒计时)
【发布时间】:2013-10-13 18:18:35
【问题描述】:

我有一个 Wicket 6.10.0 Web 应用程序。我想实现一个计时器来显示当前用户会话中的剩余时间。一些东西链接这个: http://jsfiddle.net/justinobney/uZMGD/

我的页面页脚中有一个 Wicket Label。此标签使用 JavaScript 将时间从例如 5 分钟倒计时到 0 分 0 秒。每次请求都应刷新此倒计时(标签)。

现在的问题是如何做到这一点?

在我添加的init() 方法中,AbstractRequestCycleListener 会通知我每个结束请求,如下所示:

  getRequestCycleListeners().add(new AbstractRequestCycleListener() {

     @Override
     public void onEndRequest(RequestCycle cycle) {
        super.onEndRequest(cycle);
        System.out.println("End Request - here i would like to refresh somehow the label");

     }

  });

但我不知道如何将此消息发送到标签以刷新自身。有什么想法吗?

* 编辑:* 我有一个 SPA:

<body>
lots of AJAX components here
<div wicket:id="footer">Footer always stays here. <br />
Session timeout in: <span wicket:id="sessionTimeoutLabel">countdown here</span>
</div>
</body>

倒计时有点像这样:http://jsfiddle.net/justinobney/uZMGD/

现在在每个 AJAX 请求上,我都需要 sessionTimeoutLabel 标签来重新渲染以开始从 600 秒到 0 的计数。

【问题讨论】:

    标签: java session timeout refresh wicket


    【解决方案1】:

    不要过分关注“请求结束”。这大约是渲染阶段之后的 10µs。另请注意,每次请求后会话超时都会重置,因此无需将标签更新为新值,只需将其重置为会话超时参数。

    你应该在某处有一个参数来指示你配置的会话超时,并使用它来显示标签,如果它是特定于应用程序的,你可以在你的应用程序类中创建一个 getter:

    public MyApplication extends WebApplication {
        public static final int SESSION_TIMEOUT = 30; // minutes
    
        public int getSessionTimeout() {
            return SESSION_TIMEOUT;
        }
    }
    

    您可以在页脚中添加标签:

    add(new Label("timeout", PropertyModel.of(this, "application.sessionTimeout")));
    

    或者,如果它是您会话的属性,您可以将 getter 添加到您的自定义会话中:

    public MySession extends WebSession {
        public static final int SESSION_TIMEOUT = 30; // minutes
    
        public int getSessionTimeout() {
            return SESSION_TIMEOUT;
        }
    }
    

    并在您的标签中检索它:

    add(new Label("timeout", PropertyModel.of(this, "session.sessionTimeout")));
    

    属性模型的表达式利用了 Component 具有 getter for the Applicationgetter for the Session 的事实。

    【讨论】:

    • 我想你误解了我的意思。我已经编辑了我的问题。我需要在每次请求后将 sessionTimeoutLabel 添加到 AjaxRequestTarget ,它将被重新呈现。
    • 我没有测试过,但是你可以覆盖Label组件的onEvent,获取AjaxRequestTarget(RequestCycle.get().find(AjaxRequestTarget.class)),检查它是否不为null并添加给它的标签。顺便说一句,Martijn 回答 +1。
    • 我知道我可以覆盖onEvent(),但是它应该对哪个事件做出反应? RequestRequestCycle 不要执行 IEventSource ...
    • 您可以忽略该事件并使用 mrak 的描述检索 AjaxRequestTarget。如果为null,则为正常的页面刷新,如果可用,则将标签(事件处理程序中的this指针)添加到目标
    • 只是很少的背景信息,为什么您可以“忽略”该事件:Wicket creates new default Event with AjaxRequestTarget as payload on every ajax response
    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多