Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 浏览器关闭时防止单用户多登录_Oracle_Jsp_Session_Jakarta Ee_Servlets - Fatal编程技术网

Oracle 浏览器关闭时防止单用户多登录

Oracle 浏览器关闭时防止单用户多登录,oracle,jsp,session,jakarta-ee,servlets,Oracle,Jsp,Session,Jakarta Ee,Servlets,我有一个带有“loginStatus”字段的表。现在,用户每次登录时,该值设置为1,单击注销后,该值设置为0。现在,当用户尝试登录时,会检查该字段的值,如果为0,则用户可以登录,如果为1,则用户无法登录。现在,如果以任何方式关闭浏览器,用户都无法使用该用户ID登录。因为该字段的值仍然是1(他没有单击注销按钮,所以不会更改)。除非用户关闭浏览器,否则我的应用程序运行正常 我知道这个问题可以用不同的方式解决,但我被要求这样做。现在的问题是,我在JavaEE中不是那么专业,所以我要寻找的正是多方面的解

我有一个带有“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分钟,则允许登录;否则它将被阻止