我有一个会话变量:ID。是否有可能同一台PC上的两个浏览器可以共享相同的会话变量并更新它,从而产生随机结果。我希望总有两个单独的会话和两组不同的会话变量。
我已经研究了这个,我已经来到以下网页,这表明存在会话锁以防止这种情况发生:http://odetocode.com/blogs/scott/archive/2006/05/20/会话状态,使用-A-读写器,lock.aspx。我有一个ASP.NET应用程序,随机结果表明这可能会发生。
如果需要,我会生成一些代码。
更新19:51 Tim Medora说:"使用相同会话ID的相同浏览器类型的两个实例"。这是否意味着如果用户打开一个浏览器然后关闭它(因为打开时间太长)然后打开另一个浏览器(在另一个窗口中),则可以使用相同的会话ID并复制窗口1中的会话变量对于窗口2?
更新19:35 24/10/2012 Tim Medora说:"然而,在同一个浏览器中有两个标签,或者使用相同会话ID的相同浏览器类型的两个实例#34;在这些情况下,会话信息是否会分开。例如,如果用户打开浏览器然后关闭它(在响应加载之前),然后打开具有不同会话变量集的同一窗口,则存在会话A和会话B具有相同会话变量的风险。
答案 0 :(得分:0)
随机碰撞的可能性非常低。
但是,同一浏览器中存在两个选项卡,或使用相同会话ID 1 的同一浏览器类型的两个实例。 Session IDs may also be reused,增加了混乱。
这是否意味着如果用户打开一个浏览器然后关闭它 (因为打开时间太长)然后打开另一个浏览器(在 另一个窗口)然后可以使用相同的会话ID和会话 窗口1中的变量是否复制到窗口2?
是,可以重复使用会话ID,并且可以激活相同的会话。我做了一个Chrome快速实验,我能够将一个URL(使用Session)复制到新标签和浏览器的新实例,同一个会话保持活动状态。
但是,新窗口的会话变量不是复制;它们是相同的价值观。
锁定会话仅意味着两个编写者无法在同一时间更新它。更具体地说,从请求开始到请求结束,会话锁定在Session上;只有一次写入可以在此期间改变它。但是那段时间通常很小,并且(虽然锁定可以防止一些问题)但它并不能阻止两个不同的来源在不同时间改变相同的数据。
最小化冲突的一种方法是使用唯一的会话密钥。假设用户(在同一会话中)打开两个不同的记录进行编辑。如果您的会话密钥为“ActiveRecord”,则数据损坏/不匹配的可能性非常高。但是,如果每个页面在隐藏字段中存储唯一键,则可以使用该唯一键从Session中检索适当的值,并且可以离散地操作每个值。
换句话说,使用唯一键可以安全地同时打开同一项目的两个不同实例。这样做不可防止两个窗口同时编辑同一项目的问题。虽然它们将具有单独的密钥,但在提交数据时可能不希望出现最终结果。
1 - 在所有现代浏览器中似乎都是这种情况,但我无法明确表示总是这种情况。欢迎参考。
答案 1 :(得分:0)
我最近遇到了类似的情况。在创建用户屏幕中,可以为用户输入多个地址。最初我使用session来存储地址。由于会话是跨浏览器选项卡共享的,因此功能无法正常运行。而且我也意识到在会话中存储数据不是一个好方法,因为各种原因,如在webfarm场景中维护会话状态的开销等等。所以,我不得不切换回DOM操作(因为它的mvc应用程序)来存储地址。如果是Web表单,则viewstate可能是会话的替代方式。
如已经发布的答案中所述,可以通过会话使用每个请求使用唯一键来实现,例如,在我的情况下,在会话[userid]中存储地址,或者您可以使用任何随机键来保存值并具有隐藏字段在Web请求中保留该密钥。但是,我不相信其他原因,当用户关闭标签时,它们不会被自动清除。