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

在JSP应用程序中最多强制一个用户,jsp,session,login,Jsp,Session,Login,我正在使用JSP开发一个web工具,其中有许多不同类型的用户(即管理员、来宾、支持写的用户等等)。由于这将是一个基于订阅的系统(即用户为3/6/12个月的订阅付费),我需要同时强制每个用户最多登录1次。 例如,假设约翰·史密斯先生订阅了这个系统;我不想让他把他的登录信息给他的朋友,这样他们就可以同时在两台不同的计算机上使用这个系统。 我如何处理这种情况?当用户登录时,您会希望使他们当时可能拥有的任何其他登录无效。这意味着对每个请求都进行检查,但无论如何,您都应该将其用于基本验证。例如,您可以检查

我正在使用JSP开发一个web工具,其中有许多不同类型的用户(即管理员、来宾、支持写的用户等等)。由于这将是一个基于订阅的系统(即用户为3/6/12个月的订阅付费),我需要同时强制每个用户最多登录1次。 例如,假设约翰·史密斯先生订阅了这个系统;我不想让他把他的登录信息给他的朋友,这样他们就可以同时在两台不同的计算机上使用这个系统。
我如何处理这种情况?

当用户登录时,您会希望使他们当时可能拥有的任何其他登录无效。这意味着对每个请求都进行检查,但无论如何,您都应该将其用于基本验证。例如,您可以检查他们访问的IP地址或servlet会话id等。不管怎样,这些都是需要跟踪的好事情,尤其是对于事实/报告日志记录

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

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

  • 当用户登录时,存储该用户的
    HttpSession.getId()
    。这可以在从用户名到会话ID的应用程序范围映射中,也可以在数据库中
  • 对于每个后续请求,对于已登录的用户,请检查
    request.getSession().getId()
    是否是为该用户存储的请求
  • 如果请求会话ID不是为该用户存储的会话ID,则它必须是较新会话的ID,以便以后使用相同的用户名登录。在这种情况下,通知用户另一个登录已接管,并调用
    request.getSession().invalidate()
    注销用户
  • 要记住的主要一点是,给定另一个会话(而不是当前会话)的存储会话ID,您无法取消该另一个会话


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

    我不知道您正在使用哪个框架(如果有的话)(您只指定了JSP)。但是,如果应用程序的其余部分正在利用Spring框架,那么这个特性已经在项目的中实现了。它支持多种检测和处理并发登录的方法,包括上面Peter Hilton建议的方法