2009-09-13 24 views
5

我正在设计一个功能来存储上次登录日期/时间在ASP.Net(MVC)应用程序。用于存储用户上次登录信息的良好设计模式是什么?

我的第一个直觉是将数据库中的值存储在用户的配置文件记录中,并在成功登录时将值更新为当前日期/时间。当然,只要我记录该值,所有页面将显示会话成功登录的日期和时间。

计划B:记录上一个会话的字段和记录此会话的字段。登录时,将此会话的日期/时间保存到“当前”字段,并将以前找到的值移到“前一个”字段(显然)。正是这个字段提供了我的“最后登录”值。

这是最好的方法,还是可以做得更优雅?

+0

为什么你需要存储以前和当前的登录时间? – 2009-09-13 10:03:06

+0

@Charles Conway - 只需要最后一次登录日期/时间,但它会被当前登录日期/时间覆盖。它可以用于诸如'用户上次登录昨天11:52'或'自你上次登录以来3个新项目'的功能 – 2009-09-13 10:55:36

回答

4

另一种方法是在登录时从用户记录中读取上次登录日期/时间并将其保存到会话或会话cookie中。然后用当前日期/时间更新用户记录。然后在你的页面上读取存储在session/cookie中的值。

当会话过期时,通常当用户需要重新登录时,旧时间将被删除。它还具有速度和缓存的优点,因为它是从会话/ cookie中读取的。

但这取决于您的设置和应用程序,这对您是否可行。

UPDATE

只是要清楚......当前的日期/时间每次都保存到数据库用户表中的用户登录,但日期之前/时间写入用户表,现有值将被读取并保存到会话或cookie中。然后使用当前时间戳更新用户表中的日期/时间值。

如果您的身份验证票证的持续时间超过会话时间,请使用Cookie方法,并将cookie的到期时间设置为与身份验证票证相同的届满日期。

+0

这将是我将如何处理这个问题 – 2009-09-13 09:57:13

+0

这将只保留客户端上的信息。如果用户从家中和工作中登录,则信息将不正确。 您需要在服务器上保存这些信息。 – 2009-09-13 10:03:40

+0

这不需要在服务器上保留,因为它在语义上是相同的。登录后,唯一有趣的信息是以前的登录始终存在 - 无论采取哪种方式。 – hurikhan77 2009-09-13 10:06:57

1

有一对夫妇的其他方式,你可以做到这一点...

  1. 而不必对用户的记录一栏,你可以有一个单独的表,它记录每个人的登录。如果查看上次登录日期很重要,或者为了以后的报告保留登录数据统计信息,这也可以授予您“显示最近5次登录”功能的能力。 (这会随着时间的推移建立数据,并可能需要某种清理例程或时间表脚本。)

  2. global.asax有一个Session_End事件(或类似的东西)。当用户第一次登录时,该值可以存储在会话变量中,然后当Session_End触发它时将其写入数据库。这种方法可能最终导致更多的怪异而不值得,因为你总是想知道如果Session_End没有触发会发生什么,或者如果用户在Session_End为第一次登录之前重新登录之前重新登录。

  3. 这已经有一段时间了,但有一种中间件让asp.net让你从基类继承,并实现处理会话开始/结束之前或之后会话的代码。我有一段时间没有做ASP,所以我对此很朦胧。

+0

Session_end只有在将会话状态存储在proc中时才起作用。这是要记住的。出于这个原因,我从不使用它。 – RichardOD 2009-09-13 09:53:46

0

如何创建一个实现此功能的自定义序列化类?

这样的类可以简单地作为blob序列化/反序列化到用户的配置文件。除非您需要能够查询上次登录日期,否则这可能是一个很好的解决方案。

我的第一个想法是简单地使用Stack<T>来实现这一点,但虽然它是可序列化的,但它不提供会自动驱逐旧值的钩子。

相关问题