2012-07-09 38 views
3

我需要阻止 1.两个不同的JSESSIONID存在于相同的用户帐户或 2.单个浏览器的两个选项卡引用相同的JSESSIONID。如何保证一次会话?

有什么建议吗?如果检测到现有会话,用户可以: a)退出第二次尝试 b)杀掉现有会话(刺客!)并开始新会话。

首选是服务器端解决方案。也就是说,我不想依赖于用户关闭cookie,强制JSESSIONID进入URL。

+3

使用户无法为应用程序使用不同选项卡的任何特定原因? – WhyNotHugo 2012-07-09 20:33:12

+0

等一等网站开发者想让我烦恼吧?我一直认为这更多是粗心设计的副产品。 – Voo 2012-07-09 20:47:15

+0

这不是一个利用多个选项卡的应用程序,用户可以通过在一个选项卡中读取P1,在一秒中读取P1,在触发P2中回答P1,然后在另一个中重新回答P1来搞乱状态。我们只是想为每个用户强制执行一次会话。 – 2012-07-09 20:52:59

回答

0

第1部分可以使用单例模式完成,该单例模式根据用户SID的地图检查用户的当前sessionid。

第2部分,这可以在事务性webapps中理解,您需要确保用户阅读正确的信息(而不是一个标签具有旧值和一个标签具有较新值 - 场景)......它可以使用相同的sessionid映射,在dom中注入它并使用javascript验证它。

编辑。第2部分验证可以在针对client-sessionid映射的过滤器中更好地完成。并且该对象的正确定义可确保存在真正的唯一单例实例。

+0

啊。让我来运行一些人。听起来没错。 – 2012-07-09 20:56:11

+0

首席架构师回答如下: – 2012-07-10 21:36:44

+0

“第1部分:单例在Java EE容器中是非常糟糕的解决方案。单例不应该在Java EE容器中拥有状态,因为在这些容器中不存在真正的单例(因为存在多个类装载器)。这个单例需要状态(会话ID的映射)。当然这里有解决方法,但在这种情况下可能会非常昂贵。第2部分:此处的解决方案再次使用客户端解决方案处理会话信息( Javascript) 这些“解决方案”的解决方案往往会产生负面影响。“ – 2012-07-10 21:36:55

1

在每个页面中嵌入一个隐藏的input字段,其​​中包含唯一标记,这听起来像是解决此类问题的唯一解决方案。这似乎是告诉另一个标签的唯一方式,即使它们是完全相同的网址。

请记住,虽然,你在做什么似乎是非常糟糕的做法;阻止用户使用多个选项卡的任何特定原因?