2016-07-22 112 views
2

我正在开发一个新的Asp.net MVC应用程序,对于我来说看到登录用户以及他们的注销时间是非常重要的,如果用户单击注销按钮,对我来说就没有问题。但大部分时间用户通过浏览器浏览浏览器或关闭浏览器。现在有办法。我有一个想法,每两分钟运行一次操作来检查用户是否在那里。但这是一个好主意,风险是什么。如果是这样,任何人都有一个例子可以实现!用户登录时间

回答

1

您可以使用JavaScript功能onbeforeunload事件。 当用户离开页面时,此函数被调用。

该函数将您的ajax请求放到服务器上,此时用户卸载页面并创建您的逻辑。

对于多个选项卡或多个设备,解决方案很简单。每个多个选项卡都将具有相同的会话,但即使用户相同,每个新设备也会有一个新会话。 可以做些什么来保存每个会话的最新请求,而不考虑设备。即使用户有多个设备,您的日志也会包含用户每台设备上每个会话的登录时间。

希望这有助于

+1

我曾想过这个解决方案,但这里有一个例子,如果用户打开多个选项卡。我们如何去决定。 –

+0

多个选项卡,保存用户收到的当前会话的最新请求。 – Waqar

+0

是的,我想到了这个解决方案,但是如果用户打开多浏览器或在多设备中打开它会怎么样。随着项目变大,我认为这个解决方案会变得复杂。任何方式非常感谢你的答案。如果你能看到我的评论以下看看这是不是一个好主意。 –

2

我在2天前寻找同样的事情。我的做法是现在如下:

    • 我像会话密钥和用户ID,以确定他的数据库保存一些数据用户登录。我也保存登录时间和更新日期时间。
    • 我只保存这个,如果用户已经通过身份验证。
  1. 用户呼叫行动

    • 我在数据库中的每个用户执行动作更新日期时间。
  2. 用户使用注销按钮

    • 我谨从表“会话”数据库中的条目“sessionHistory”和更新日期时间到退出时间。
  3. 用户关闭浏览器(这是它得到棘手)

    • 我建了一个很小的一段代码使用jQuery。我调用$ .get,并在MVC中每隔30秒戳一次“UpdatePing”动作。

    • “UpdatePing”操作将更新数据库中的会话条目。现在我可以看到他的浏览器是否仍然打开。

    • 警告:您不会确切地知道用户何时关闭标签页/浏览器。你可以尝试使用“beforeunload”事件,但我不会依赖它(浏览器崩溃等)。

  4. 删除过期会话

    • 我不完全删除会话数据。我将会话数据复制到“sessionHistory”表中。
+0

我刚刚在另一个问题中看到了你的评论(关于多个标签)。 你可以尝试基于ping来计算它。 – KampfFussel

+1

在每个会话中ping都会在竞争环境中产生大量开销,尤其是当您可以使用JavaScript onbeforeunload中的一个内置功能时。或者甚至是Ajax控制工具包来在用户关闭该窗口时只ping一次服务器,并保存用户的最新请求以估计用户离开你的应用的精确时间。 – Waqar

+0

这是真的,如果浏览器没有正确关闭,alluninforeunload不会触发。如果这不重要,请跳过ping和会话更新,并使用onbeforeunload事件重定向到注销页面。 – KampfFussel

0

感谢所有的答案,但答案都可能得在复杂项目时会较大的方式。例如,我将用移动应用程序支持该应用程序。 我发现最好的解决方案是使用SignalR从客户端发送单个到服务器,当这些单一停止一段时间后,我将自动注销用户。

+0

SignalR每隔一段时间后对每个用户都会产生很大的开销。从这一点来看,这将是一个巨大的资源使用情况。 – Waqar