2012-04-12 35 views
2

我有一个字段为'loginStatus'的表。现在,每次用户登录时,该值都设置为1,并且在单击注销后将该值设置为0.现在,当用户尝试登录时,将检查该字段的值,如果该值为0,则用户可以登录,如果是1,则用户无法登录。现在,如果无论如何浏览器已关闭,用户将无法使用该用户ID登录。因为该字段的值仍然是1(他没有点击注销按钮,所以它没有改变)。除非用户关闭浏览器,否则我的应用程序运行良好。浏览器关闭时的单用户多登录预防

我知道这个问题可以以不同的方式解决,但我被要求这样做。现在的问题是我没有那么多的Java EE的亲,所以多个帮助解释正是我正在寻找。

另外我有一个可能的解决方案,就像:创建一个数据库触发器,将loginStatus值更改为0,这将在用户登录后15分钟后触发。现在我也不知道如何创建会在特定时间后触发的触发器。

回答

1

您可以创建定期运行并使旧会话过期的数据库作业。根据您使用的Oracle版本,您可以使用DBMS_JOB包或更复杂的DBMS_SCHEDULER包。 DBMS_JOB是一个较旧的包,但对于这样相对简单和孤立的任务,学习曲线较少。举例来说,如果你有一个存储过程UNLOCK_ACCOUNTS,当执行时,确定哪些帐户解锁和解锁它们,你可以使用DBMS_JOB有该程序运行,每15分钟

DECLARE 
    l_jobno INTEGER; 
BEGIN 
    dbms_job.submit(l_jobno, 
        'BEGIN unlock_accounts; END;', 
        sysdate + interval '15' minute, 
        'sysdate + interval ''15'' minute'); 
    commit; 
END; 

当然,你也可以使用一个Java调度器(Quartz是一个流行的)或DBMS_SCHEDULER包来做同样的事情。但是,这确实需要存在某个存储登录时间戳的字段,以便UNLOCK_ACCOUNTS过程可以计算出超过15分钟前发生的登录。

然而,一般来说,这整个架构是相当可疑的。很奇怪的是,您希望有一个基于Web的应用程序(本质上是无状态的)拒绝登录,因为用户在较早的时间点打开了另一个浏览器。如果一段时间作为安全事项暂时停用,超时会比较常见,但15分钟对于这类事情通常太短 - 即使银行网站通常会让您闲置的时间比这更长。而且这种方法甚至不会阻止您同时从多个浏览器/计算机登录,只要登录发生的时间相距超过15分钟即可。

2

如果您已经强制要求您满足此要求,则无需运行任何工作即可自动过期。

而不是一个简单的“开/关”标志,在设置为当前日期/时间的表上有一个日期/时间戳。每当用户用请求点击服务器时,您都会将此列更新为当前时间。

如果第二个会话尝试登录,该会话应该检查表上的日期/时间戳,如果它超过15分钟前,则允许登录;否则会被阻止。

相关问题