Oracle 浏览器关闭时防止单用户多登录
我有一个带有“loginStatus”字段的表。现在,用户每次登录时,该值设置为1,单击注销后,该值设置为0。现在,当用户尝试登录时,会检查该字段的值,如果为0,则用户可以登录,如果为1,则用户无法登录。现在,如果以任何方式关闭浏览器,用户都无法使用该用户ID登录。因为该字段的值仍然是1(他没有单击注销按钮,所以不会更改)。除非用户关闭浏览器,否则我的应用程序运行正常 我知道这个问题可以用不同的方式解决,但我被要求这样做。现在的问题是,我在JavaEE中不是那么专业,所以我要寻找的正是多方面的解释帮助Oracle 浏览器关闭时防止单用户多登录,oracle,jsp,session,jakarta-ee,servlets,Oracle,Jsp,Session,Jakarta Ee,Servlets,我有一个带有“loginStatus”字段的表。现在,用户每次登录时,该值设置为1,单击注销后,该值设置为0。现在,当用户尝试登录时,会检查该字段的值,如果为0,则用户可以登录,如果为1,则用户无法登录。现在,如果以任何方式关闭浏览器,用户都无法使用该用户ID登录。因为该字段的值仍然是1(他没有单击注销按钮,所以不会更改)。除非用户关闭浏览器,否则我的应用程序运行正常 我知道这个问题可以用不同的方式解决,但我被要求这样做。现在的问题是,我在JavaEE中不是那么专业,所以我要寻找的正是多方面的解
另外,我还有一个可能的解决方案,它类似于:创建一个数据库触发器,将loginStatus值更改为0,该值将在用户登录后(比如15分钟)触发。现在我也不知道如何创建在特定时间后触发的触发器。您可以创建一个定期运行并使旧会话过期的数据库作业。根据您使用的Oracle版本,您可以使用
DBMS\u作业
包或更复杂的DBMS\u调度程序
包DBMS_作业
是一个较旧的包,但对于这样相对简单和孤立的任务,学习曲线较少。例如,如果您有一个存储过程UNLOCK\u ACCOUNTS
,该过程在执行时确定要解锁和解锁哪些帐户,则可以使用DBMS\u 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调度器(这是一种流行的调度器)或DBMS\u调度器
包来做同样的事情。但是,这确实需要在某个地方有一个存储登录时间戳的字段,以便UNLOCK_ACCOUNTS
过程可以确定哪些登录发生在15分钟之前
然而,总体而言,整个体系结构相当可疑。非常奇怪的是,您希望一个基于web的应用程序(本质上是无状态的)拒绝登录,因为用户在早些时候打开了另一个浏览器。如果会话在一段时间内处于非活动状态,出于安全考虑,超时会话是比较常见的,但是15分钟对于这种事情来说通常太短了——即使是银行网站通常也允许您空闲更长的时间。而且,只要登录间隔超过15分钟,这种方法甚至不会阻止您同时从多个浏览器/计算机登录。如果您强制执行此要求,您可以在不运行任何作业的情况下自动终止帐户 在表上设置一个日期/时间戳,将其设置为当前日期/时间,而不是简单的“开/关”标志。当用户偶尔向服务器发出请求时,您会将此列更新为当前时间 如果第二个会话尝试登录,该会话应检查表上的日期/时间戳,如果超过15分钟,则允许登录;否则它将被阻止