2

在我的应用程序中,每次用户登陆我的网站时,我都会使用其会话 ID 检查该用户,并在数据库中插入(包含所有详细信息 ip、浏览器等),如果其会话 ID 不同

string sessionId = HttpContext.Current.Session.SessionID;
if (objDB.checkDuplicate("session", "sessionId", sessionId))
{
    // code to make insert in database
}

但是在检查数据库时,我同时从同一个 IP 获得多个插入。

谁能解释为什么会这样?

注意:用户的 SESSION 不同,所以checkDuplicate()可以正常工作,但用户如何同时拥有不同的会话 ID?(或这样的时间跨度)

4

2 回答 2

4

很可能是多人通过路由器或代理服务器共享同一连接。

于 2012-10-03T15:44:49.710 回答
2

更多原因(很可能是在路由器/代理后面)对相同 IP 有不同的会话 ID

  • 重新启动浏览器将为同一用户创建新的会话 ID(只要它在会话 cookie 中设置)
  • 打开单独的浏览会话(即 IE 的普通与私有,取决于配置和浏览器选项卡可能被视为单独的会话)
  • 同一台计算机上的不同用户

不同会话 ID 的另一组原因是基于未能在请求之间设置持久会话 cookie:

  • 我认为如果没有写入 ASP.Net 会话状态 cookie 可以在每个请求上重新生成(需要验证)
  • cookie 可以被禁用(很少见,但可能)
  • cookie 可以被阻止(即 IFrame 中的页面/图像缺少 P3P 策略)或浏览器中的某些其他策略

有正当理由为同一用户获取同一 sessionId 的多个浏览器窗口(同一“浏览器会话”中的选项卡,使用 Ctrl+单击“在新窗口/选项卡中打开”)。作为站点创建者,您必须决定是要尝试执行“单个会话 = 单个窗口”策略还是处理在同一会话中可能打开的多个窗口。我知道没有合理的方法来检测在不同选项卡中使用相同会话 ID 的情况,特别是如果您必须支持 GET 请求(否则您可以将一些附加 ID 转储到隐藏字段中)。

于 2012-10-03T16:03:20.090 回答