我正在用 C++ 创建自己的(多线程)基于 ISAPI 的网站,并且正在尝试实现正确的会话管理。
问题是当应该创建一个新会话时,在生成的网页中使用后续请求时会创建两次会话。
下面是它的工作原理: - 客户端请求http://localhost并且不发送 cookie 或发送带有旧会话 ID 的 cookie。- 服务器查看会话 cookie 并认为它需要创建一个新的,因为它不再存在:它准备一个带有新会话 ID 的 cookie 的标头,并将完整的标头发送给客户端(我用Firefox 中的 http live headers 插件,它是正确的)。它还准备一些数据,例如页面和类似的东西(还没有正文数据,因为它仍在处理来自数据库的数据和类似的东西)并将它拥有的内容发送回客户端。- 客户端现在应该有这个新的会话 cookie,并看到样式表链接并立即发送样式表请求http://localhost/css到我的服务器。但是……出于某种原因,他仍然使用旧的会话 ID,而不是新收到的 ID!- 服务器看到这个请求(再次带有不再存在的会话 id),生成另一个新会话并发送带有 cookie 的新会话 id 以及样式表数据。
所以客户端现在收到了两个会话 ID,并且从现在开始继续使用第二个,因为第一个被覆盖,但是第一页使用了错误的会话(或者实际上,第二页有)。
你可以说这不是问题,但是当我开始使用个性化样式表时,我会在第一页上显示错误的样式表,并且由于页面将使用 AJAX 刷新内容(如果可用),样式表可能除非客户端刷新,否则永远不会重新加载。
那么,这是做这种事情时一直存在的问题吗?浏览器是否会一直发送旧的 cookie,尽管它已经收到了新的 cookie,但仍在处理页面?这是一个问题,例如 PHP,也有吗?
注意:在所有关于“改用 php”之类的讨论开始之前:我正在重写一个我最初用 PHP 编写的网站,它变得流行,每小时有成千上万的(真实)访问者并开始杀死我的服务器(网站没有赚到我可以扔很多服务器的那种钱)。通过用 C++ 编写,请求需要 2 毫秒而不是 PHP 中的 200 毫秒……我可以优化一切。通过花时间正确开发这个 ISAPI,它是安全的多线程并且可以多处理、多服务器。最重要的是,我喜欢挑战。
补充说明:似乎只有当cookie中存在旧会话时才会出现问题,因为当我从浏览器中完全清除所有cookie,并创建一个新cookie并将其发送回客户端时,后续样式表请求会立即使用给定的会话 ID。这似乎是在发送旧会话 id 时我做错了什么的某种证明……是否应该先删除现有的 cookie?如何?
补充说明:cookie 的有效期提前一年。