0

我有一个会话变量:ID。同一台 PC 上的两个浏览器是否有可能共享相同的会话变量并对其进行更新,从而产生随机结果。我希望总是有两个单独的会话,带有两组单独的会话变量。

我对此进行了研究,并且浏览了以下网页,这表明存在会话锁以防止这种情况发生:http://odetocode.com/blogs/scott/archive/2006/05/20/session-state -使用-a-reader-writer-lock.aspx。我有一个 ASP.NET 应用程序,随机结果表明这可能会发生。

如果需要,我会生成一些代码。

更新 19:51 Tim Medora 说:“使用相同会话 ID 的相同浏览器类型的两个实例”。这是否意味着如果用户打开一个浏览器然后关闭它(因为打开时间太长)然后打开另一个浏览器(在另一个窗口中),那么可以使用相同的会话 ID 并复制窗口 1 中的会话变量对于窗口 2?

2012 年 10 月 24 日更新 19:35 Tim Medora 说:“但是,在同一个浏览器中存在两个选项卡的可能性非常大,或者同一浏览器类型的两个实例使用相同的会话 ID”。在这些情况下,会话信息是否会分开。例如,如果用户打开浏览器然后关闭它(在响应加载之前),然后打开具有不同会话变量集的同一个窗口,那么会话 A 和会话 B 具有相同会话变量的风险。

4

2 回答 2

0

I faced similar situation recently. In create user screen, multiple addresses can be entered for the user. Initially I used session for storing addresses. Since session is shared across browser tabs, functionality didn't work well. And also I realized storing data in session is not a good approach due to various reasons like overhead in maintaining session state in webfarm scenario, etc. So, I had to switch back to DOM manipulation (since its mvc application) to store addresses. If it is web forms, viewstate might be alternative for session.

As mentioned in already posted answer, it can be achieved through sessions by using unique key per request i.e., in my case, storing addresses in session[userid] or you can use any random key to hold the values and have hidden fields to persist that key across web requests. However, I was not convinced by other reason that they will not be cleared automatically when user closes the tab.

于 2012-10-23T19:12:24.100 回答
0

随机碰撞的可能性极低。

但是,在同一个浏览器中存在两个选项卡的可能性非常大,或者同一浏览器类型的两个实例使用相同的会话 ID 1会话 ID 也可能被重复使用,从而增加了混乱。

这是否意味着如果用户打开一个浏览器然后关闭它(因为打开时间太长)然后打开另一个浏览器(在另一个窗口中),那么可以使用相同的会话 ID 并复制窗口 1 中的会话变量对于窗口 2?

是的,会话 ID 可以重复使用,并且同一会话可能处于活动状态。我用 Chrome 做了一个快速的实验,我能够将一个 URL(它使用会话)复制到浏览器的新选项卡和新实例中,并且同一个会话保持活动状态。

但是,不会为新窗口复制会话变量;它们是相同的值。

会话锁定

Locking Session 只意味着两个作者不能同时更新它。更具体地说,从请求开始到请求结束,对 Session 加了一个锁;在此期间,只有一次写入可以更改它。但是这段时间通常非常短,并且(虽然锁定可以防止一些问题)它不会阻止两个不同的来源在不同的时间更改相同的数据。

避免碰撞

最小化冲突的一种方法是使用唯一的会话密钥。假设用户(在同一个会话中)打开两条不同的记录进行编辑。如果您有“ActiveRecord”会话密钥,则数据损坏/不匹配的可能性非常高。但是,如果每个页面在隐藏字段中存储一个唯一键,则该唯一键可以用于从 Session 检索适当的值,并且可以离散地操作每个值。

换句话说,唯一键允许您同时安全地打开同一项目的两个不同实例。这并不能防止两个窗口同时编辑同一个项目的问题。尽管它们将具有单独的键,但在提交数据时最终结果可能是不可取的。

1 - 在所有现代浏览器中似乎都是这种情况,但我不能肯定地说总是如此。欢迎参考。

于 2012-10-23T18:33:37.360 回答