2013-03-06 102 views
0

我想从我的访问ColdFusion应用程序不止一次在同一时间阻止用户。阻止用户在网站上

我有dtlogin,请dtLogLastUpdate,IP和isLogged SQL表。

逻辑是:

会话超时时间为1小时。

当用户登录时,

  • 组的Dtlogin =邮戳现在
  • dtLogLastUpdate =邮戳现在
  • IP =用户IP
  • isLogged = 1

我使用每1分钟更新一次AJAX呼叫更新dtLogLastUpdate

当我得到用户的登录请求时,只允许它在isLogged为0或dtLogLastUpdate超过我的会话超时。

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

+2

我会考虑使用onSessionEnd以自动方式记录人员。这将处理关闭浏览器的人员。另外,如果浏览器关闭,则DtLogLastUpdated将为x分钟。如果浏览器已打开并正在进行ajax调用,则会话将保持活动状态,并使dtLogLastUpdated保持最新状态。您可能还想要搜索“coldfusion谁在线”应用程序。那里有一个可能提供代码样本的旧版本。 – steve 2013-03-06 21:19:00

+0

也许你可以注销'旧用户'并允许'新用户'登录。 – 2013-03-06 21:19:44

+0

你不能比较'dtLogLastUpdate'到当前时间吗?如果它在一分钟内还没有ping通,我认为你可以假设他们关闭了他们的标签 – 2013-03-06 21:19:44

回答

2

我会创建一个名为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秒,减少后台进程。

+1

您可能会提到,其缺点是用户需要等到会话过期(OP的情况下1小时)才能再次登录。当他们没有正确注销时。 – 2013-03-07 01:28:53

+0

如果他使用J2EE会话管理,则不需要。 – Travis 2013-03-07 01:32:23

+0

如果他们关闭他们现有的浏览器(全部)并打开一个新的浏览器。我在上面的评论中也提到过。这是你所指的吗? – 2013-03-07 01:34:22