在桌面应用程序中管理登录会话:在哪个层?

tmh*_*tmh 5 java session layer session-timeout

我必须满足以下要求:

[...]如果登录的用户闲置超过30分钟,他必须退出.

其中,闲置的意思是"不按鼠标也不键盘".

现在,当我第一次阅读它时,我非常确定如何实现这一点:对我而言,它听起来像是与业务逻辑有关的要求,所以我应该在业务层实现它(具有3层架构) .
这里有一些代码:

// simplified and generalized version of my login method
public boolean login(String email, String password) {
    user = dao.read(email, password); //returns either null or the user
    boolean logged = user != null;
    if (logged) {
       // initialize Session somehow, let's say for example:
        Session.start();
    }
    return logged;
}

// simplified and generalized version of my logout method
public void logout() {
    operatore = null;
    // terminate Session somehow, let's say for example:
    Session.destroy();
}
Run Code Online (Sandbox Code Playgroud)

这将是理想的,但有一个问题:Session应该知道如何检测用户不活动(然后是火logout()方法)......但不幸的是,这完全取决于GUI的制作方式!
[只是要明确:我知道我要做到这一点,但我想独立完成我如何实现UI(例如Java Swing,命令行,基于Web等)]

我的意思是,业务层不能(并且不应该imo)捕获用户事件/交互,所以我应该Session在GUI包中实现 从那里使用它:在我的设计中,一个层应该只与其严格的下层接口和不应该知道任何更高级别(数据访问层是独立的(好吧,它取决于数据库和其他持久性机制),业务层只依赖于数据访问层接口,表示层仅依赖于业务层接口).

问题是我听起来不对,我认为在表示层中我认为是业务逻辑要求的一部分.

顺便说一句,会话到期可能需要对表示逻辑做太多,因为必须"监听"用户输入.

这让我想起了我前一段时间回答过的另一个相关问题,但我也会问这个问题,以避免任何疑问:链接到这个问题.

我想听听一些有价值的意见,主要集中在良好的设计实践上.

小智 1

正如要求所说

如果登录用户闲置超过30分钟,则必须注销。

所以这里的输入是键盘或鼠标活动。当然这属于表示层。

在 Web 应用程序场景中,鼠标/键盘活动(实用程序)模块触发会话超时。

我们可以使用观察者/监听者模式。如果是java中的

http://www.vogella.com/articles/DesignPatternObserver/article.html会有帮助

使用 httpssession 侦听器,我们可以将此活动传递到业务层。这意味着您可以调用业务层功能来进行清理。

在桌面场景中,我们可以使用 Swing 应用程序,其中可以使用类似的模式。

所以重点是表示层根据实用程序类提供的输入通知其他层。