2014-01-13 38 views
1

请考虑以下情形。Glassfish 3.X,以编程方式处理任意HTTPSession的终止

我已经在Glassfish 3.1.1上部署了一个Java EE Web应用程序(JSF 2.2,JPA,EJB 3.0,即使这里的框架无关紧要),它具有一个登录保护区,我通过该标准Glassfish安全机制。

我的商业模式基于将此Web应用程序作为服务的访问权限出售,禁止同时为单个用户名/密码进行多次登录。出于这个原因,我在我的数据库中保留一列,以便在用户登录时递增,并在用户注销时递减。另外,我在用@PreDestroy注解的SessionScoped托管bean中有一个方法,负责在会话过期时(通过session-timeout属性在web.xml中配置60分钟)递减计数器。

当用户尝试使用大于1的计数器登录时,应用程序通知他有关该问题,请他先登录以前的工作站。

这工作得很好,但我们有一个递增量的用户执行他们的操作,关闭浏览器(没有登出),然后在会话超时限制内尝试从不同的工作站进行身份验证(其中,再次,我们已经设定为60分钟)。

在这种情况下,我们希望能够报价关闭所有直接从新工作站(这样的用户X,登录用自己的会话关联到用户登录前几届会议的机会,应该可以要求终止与其账户逻辑链接的不同会话)。我知道,如果他/她只等了60分钟,会议将最终由Glassfish终止,但我们希望避免来自这个“问题”的支持请求(您知道这很难解释这种东西,技术用户)。

我的第一个计划是将用户HTTPSession的jsession ID存储在某处,通过存储的jsession ID访问旧会话(如果有的话),并根据需要关闭或使其失效。我已经阅读了很多有关该主题的资料,并且我发现this SO question显然是我正在寻找的答案(一种使用jsessionID作为密钥将HTTPSession存储在地图中以将其取回的方法)。这似乎很简单,我可以在几分钟内实现这一点,但下面的评论,特别是来自@BalusC的答案的第二部分,促使我问我如何以安全的方式实现这一点。

这是一个最佳实践的问题,你们如何实现这一点?

我不需要代码,只需要您作为Java EE架构师的意见或某个关于该主题的文档的参考。

回答

0

跟踪数据库中的所有登录(当会话被破坏时,您可以使用HttpSessionListener删除条目)。确保你有一个布尔列“现在应该终止会话!”在DB中默认为false。当现在执行该操作杀死所有其他会话时,为这些会话设置布尔值为true。在过滤器中,对每个请求,检查数据库中的布尔值并相应地进行处理。

这样你就不需要处理所有物理实例。

+0

好吧,我明白你的观点。不要摧毁所有旧的会话,而是建议从逻辑上使它们失效,以允许访问新会话。即使我担心过滤器引入的额外开销会影响每个请求,这似乎也可以。我接受你的回答,如果它按预期工作,我会通知你。 – elbuild

相关问题