这是ASP.Net应用程序的上下文。应用程序使用为页面设置的特定数据。设置此数据后,此页面中的所有操作都将使用设置数据。
问题在于,如果用户打开另一个带有竞争数据的选项卡,它会覆盖同一会话的旧数据以及使第一个选项卡上的操作无效的同一用户。
我知道建议的方法是重构代码以删除这种耦合,但这是不可能的。这是讨论这个问题的另一个线程,但除了重构代码之外没有指定任何解决方案(http://stackoverflow.com/questions/632062/ways-to-detect-ctrl-n-or-when-a-user-opens -a-新窗口)
那么,如何通过javascript / Jquery检测(并通知用户)或阻止用户打开另一个标签?
答案 0 :(得分:1)
当用户第一次打开应用程序时,您可以设置会话变量isActive
并将其设置为true以及所有其他会话数据。在此之后,如果用户打开另一个选项卡,请检查isActive
是否为真。如果是,请通知用户,不要再次设置数据。
在伪代码中,你的逻辑应该像这样流动
if (!isActive)
//set session data
else
//alert the user: You have another active session
这是一个更好的解决方案,因为无法保证用户不会访问页面来设置会话,然后暂时关闭Javascript以启动新标签而不会收到通知。
答案 1 :(得分:1)
您应该意识到,您无法阻止同一用户在同一网站上打开多个网页。用户总是可以使用同一计算机上的多个不同浏览器或不同计算机上的浏览器来执行此类操作。因此,您真正需要做的是将应用程序设计为只是优雅地处理这种情况或检测到这样的冲突并确定发生时最安全的操作(可能是在服务器上,您忽略了所有会话的数据,但一个或你以某种方式将它们合并在一起)。安全行动取决于数据是什么或如何更改。
最直接的选择是每次用户访问时为用户注册新的基于服务器的会话,并且在服务器上使所有先前的会话无效,以便尝试对服务器进行任何未来更新的任何旧会话将是由于会话无效而被拒绝。这可以防止任何类型的多会话数据冲突。
如果您希望能够在会话失效时通知用户,只要窗口打开并在您的站点上检查会话,您就可以对服务器进行慢速轮询(例如每20分钟一次)有效性,以便您可以在会话过期时通知用户。