在JSP应用程序中最多强制执行一个用户

时间:2008-11-28 16:52:36

标签: jsp session login

我正在使用JSP开发一个Web工具,其中有许多类型的用户(即管理员,访客,支持写入的用户......)。由于这将是一个基于订阅的系统(即用户支付3/6/12个月的订阅),我需要同时对每个用户最多登录1次。 例如,约翰史密斯先生赞成这个系统;我不希望他将他的登录信息提供给他的朋友,以便他们同时使用来自2台不同计算机的系统。 我该如何处理这种情况?

3 个答案:

答案 0 :(得分:1)

  1. 当用户登录时,存储该用户的HttpSession.getId()。这可以在应用程序范围中从用户名映射到会话ID,或者在数据库中。
  2. 对于每个后续请求,对于已登录的用户,请检查request.getSession().getId()是否为该用户存储的那个。
  3. 如果请求会话ID不是为该用户存储的ID,则它必须是较新会话的ID,以便以后使用相同的用户名登录。在这种情况下,请通知用户其他登录已接管,并致电request.getSession().invalidate()以退出该用户。
  4. 要记住的主要事情是,给定另一个会话的存储会话ID - 而不是当前会话 - 你不能取消那个其他会话。

    此外,除非您在超时后清除存储的会话ID,否则您无法拒绝第二次登录尝试,因为您无法判断第一个会话是否仍处于活动状态。

答案 1 :(得分:1)

我不知道你正在使用哪个(如果有的话)框架(你只指定了JSP)。但是,如果您的应用程序的其余部分正在利用Spring Framework,则此功能已在ConcurrentSessionFilter项目的Spring Security中实现。它支持多种检测和处理并发登录的方法,包括Peter Hilton在上面提出的登录方式。

答案 2 :(得分:0)

当用户登录时,您将希望使他们当时可能拥有的任何其他登录失效。这意味着要对每个请求进行检查,但无论如何都要进行基本验证。例如,您可以检查他们正在访问的IP地址,或者servlet会话ID等。这些都是需要跟踪的好东西,特别是对于事实/报告记录。

然后,您可以使用已注销的烦恼来执行您的策略,而不会无法从一个系统转到另一个系统并继续使用该界面。

使用上述事实/报告日志来分析登录,以查看是否有任何似乎具有与典型单个用户不匹配的使用模式 - 例如,在两台或多台计算机之间频繁交换的会话,尤其是在相似的时间。