我有一个包含字段'loginStatus'的表。现在,每次用户登录时,该值都设置为1,并且在单击logout后,该值将设置为0.现在,当用户尝试登录时,将检查该字段的值,如果为0,则用户可以登录,如果是1则用户无法登录。现在,如果任何意思是浏览器关闭,则用户无法使用该userID登录。因为该字段的值仍为1(他没有单击注销按钮,因此不会更改)。除非用户关闭浏览器,否则我的应用程序运行正常。
我知道这个问题可以有所不同,但我被要求这样做。现在的问题是我在Java EE中不那么专业,所以对解释的多次帮助正是我正在寻找的。 p>
此外,我有一个可能的解决方案,例如:创建一个数据库触发器,将loginStatus值更改为0,这将在用户登录后15分钟后触发。现在我也不知道如何创建那种在特定时间后触发的触发器。
答案 0 :(得分:2)
如果你强制要求这个要求,你可以自动使帐户到期,而不必运行任何工作。
在表格上设置日期/时间戳而不是简单的“开/关”标志,该日期/时间戳设置为当前日期/时间。当用户通过请求点击服务器时,您不时会将此列更新为当前时间。
如果第二个会话尝试登录,该会话应检查表上的日期/时间戳,如果超过15分钟,则允许登录;否则它被阻止。
答案 1 :(得分: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分钟。