我正在使用JSP开发一个Web工具,其中有许多类型的用户(即管理员,访客,支持写入的用户......)。由于这将是一个基于订阅的系统(即用户支付3/6/12个月的订阅),我需要同时对每个用户最多登录1次。 例如,约翰史密斯先生赞成这个系统;我不希望他将他的登录信息提供给他的朋友,以便他们同时使用来自2台不同计算机的系统。 我该如何处理这种情况?
答案 0 :(得分:1)
HttpSession.getId()
。这可以在应用程序范围中从用户名映射到会话ID,或者在数据库中。request.getSession().getId()
是否为该用户存储的那个。request.getSession().invalidate()
以退出该用户。要记住的主要事情是,给定另一个会话的存储会话ID - 而不是当前会话 - 你不能取消那个其他会话。
此外,除非您在超时后清除存储的会话ID,否则您无法拒绝第二次登录尝试,因为您无法判断第一个会话是否仍处于活动状态。
答案 1 :(得分:1)
我不知道你正在使用哪个(如果有的话)框架(你只指定了JSP)。但是,如果您的应用程序的其余部分正在利用Spring Framework,则此功能已在ConcurrentSessionFilter项目的Spring Security中实现。它支持多种检测和处理并发登录的方法,包括Peter Hilton在上面提出的登录方式。
答案 2 :(得分:0)
当用户登录时,您将希望使他们当时可能拥有的任何其他登录失效。这意味着要对每个请求进行检查,但无论如何都要进行基本验证。例如,您可以检查他们正在访问的IP地址,或者servlet会话ID等。这些都是需要跟踪的好东西,特别是对于事实/报告记录。
然后,您可以使用已注销的烦恼来执行您的策略,而不会无法从一个系统转到另一个系统并继续使用该界面。
使用上述事实/报告日志来分析登录,以查看是否有任何似乎具有与典型单个用户不匹配的使用模式 - 例如,在两台或多台计算机之间频繁交换的会话,尤其是在相似的时间。