Ajax 阻止用户多次登录网站

Ajax 阻止用户多次登录网站,ajax,login,coldfusion,cfml,Ajax,Login,Coldfusion,Cfml,我想阻止用户同时多次访问我的ColdFusion应用程序 我有一个带有dtLogin、dtLogLastUpdate、ip和islog的SQL表 逻辑是: 会话超时为1小时 用户登录时 立即设置dtLogin=日期戳 dtLogLastUpdate=立即加盖日期戳 ip=用户ip isLogged=1 我使用AJAX调用每1分钟更新一次dtLogLastUpdate 当我收到用户的登录请求时,仅当isLogged为0或dtLogLastUpdate大于我过去的会话超时时才允许它 当用户关闭浏

我想阻止用户同时多次访问我的ColdFusion应用程序

我有一个带有dtLogin、dtLogLastUpdate、ip和islog的SQL表

逻辑是:

会话超时为1小时

用户登录时

  • 立即设置dtLogin=日期戳
  • dtLogLastUpdate=立即加盖日期戳
  • ip=用户ip
  • isLogged=1
我使用AJAX调用每1分钟更新一次
dtLogLastUpdate

当我收到用户的登录请求时,仅当
isLogged
为0或
dtLogLastUpdate
大于我过去的会话超时时才允许它


当用户关闭浏览器但之前未注销时,如何管理?他们需要等到会话超时吗?

我将创建一个名为currentUsers的应用程序变量

您可以使用数组或列表,我认为数组函数更快,但根据您的ColdFusion版本,搜索数组可能会很痛苦。为了简单起见,我将使用列表函数

当用户尝试登录时,请检查用户名列表。如果没有,请将用户名添加到列表中,并允许他们登录。如果用户名存在,将其发送到默认的“太糟糕了,太悲伤”登录页

<cfif listFindNoCase(application.currentUsers, form.userName)> 
    <cflocation url = "shameOnYou.cfm">
<cfelse>
    <cfset listAppend(application.currentUsers, form.userName)>
    <cfset session.whatever>
</cfif>

在application.cfc中,使用onSessionEnd从列表中删除用户名

<cffunction onSessionEnd...>
    <cfset listDeleteAt(application.currentUsers,listFind(application.currentUsers, session.userName))>
</cffunction>


这样做的好处是不需要使用Ajax来每隔60秒更新日志文件,减少后台进程。这将处理关闭浏览器的用户。此外,如果关闭浏览器,DTLOGLASTUPDATE将为x分钟。如果浏览器处于打开状态并进行ajax调用,会话将保持活动状态,并使dtloglast保持最新。您可能还想搜索“coldfusion谁在线”应用程序。有一个旧的可以提供代码示例。也许您可以注销

旧用户
并允许
新用户
登录。您不能将
dtLogLastUpdate
与当前时间进行比较吗?如果一分钟内没有ping,我想你可以假设他们关闭了他们的选项卡。你可以检查
dtLogLastUpdate
的值在过去超过1分钟。由于您每1分钟更新一次,如果尚未更新,则可以假定它们已消失。但我不知道我会相信多少???我不相信来自客户的任何数据。在我的应用程序中,我通常依赖于您提到的会话超时。注意:如果用户关闭浏览器(所有实例)并打开一个新的浏览器,那么就ColdFusion而言,他们将获得一个新会话。您可以从who在线例行程序的示例中借用一些代码。看起来不错。你可能会提到,这样做的缺点是,用户需要等到会话到期(OP的情况下为1小时)后才能再次登录。当他们没有正确注销时。如果他们关闭现有浏览器(全部)并打开一个新浏览器。我在上面的评论中也提到了这一点。这也是你指的吗?他也可以在卸载之前使用JavaScript的
。我认为对它的支持相当广泛。