我正在用C ++创建自己的(多线程)基于ISAPI的网站,我正在尝试实现正确的会话管理。
问题在于,当创建新会话时,在生成的网页中使用后续请求时会创建两次会话。
以下是它的工作原理: - 客户请求http://localhost并发送没有cookie或带有旧会话ID的cookie。 - 服务器查看会话cookie,并认为它需要创建一个新的,因为它不再存在:它使用新的会话ID准备带有cookie的标头,并将完整的标头发送到客户端(我跟踪它firefox中的http live headers插件,它是正确的)。它还准备了一些数据,如页面和类似的东西(还没有正文数据,因为它仍在处理来自数据库的数据和类似的东西),并将它返回给客户端。 - 客户端现在应该有这个新的会话cookie,并看到样式表链接并立即将样式表请求http://localhost/css发送到我的服务器。但是......出于某种原因,他仍然使用旧会话ID执行此操作,而不是使用新收到的会话ID! - 服务器看到此请求(再次不再存在会话ID),生成另一个新会话并使用cookie和样式表数据发送新会话ID。
因此,客户端现在已经收到两个会话ID,并且从现在开始将继续使用第二个会话ID,因为第一个会被覆盖,但是第一页使用了错误的会话(实际上,第二页已经使用了)。 / p>
你可以说这不是问题,但是当我开始使用个性化样式表时,我会在第一页上有错误的样式表,并且由于页面将使用AJAX来刷新内容(如果可用),这是可能的除非客户端刷新,否则永远不会重新加载样式表。
那么,这是一个在做这种事情时总是存在的问题吗?浏览器是否总是发送一个旧的cookie,虽然它已经收到一个新的但仍在处理该页面?这是一个问题,例如PHP,还有吗?
注意:在所有的讨论开始之前,“使用php代替”或者其他东西:我正在重写一个我最初用PHP编写的网站,它变得流行,每小时都有成千上万的(真实)访问者并开始查杀我的服务器(该网站没有那种我可以投入大量服务器的钱)。通过用C ++编写,在PHP中请求需要2ms而不是200ms ......我可以优化所有内容。通过花时间正确开发此ISAPI,它可以安全地实现多线程,并且可以进行多处理,多处理。最重要的是,我喜欢挑战。
添加注释:似乎问题只出现在Cookie中存在旧会话时,因为当我完全清除浏览器中的所有Cookie,并创建新的Cookie并将其发送回客户端时,后续的样式表请求立即使用给定的会话ID。这似乎是某种证据,证明我在发送旧的会话ID时做错了...是否应该首先删除现有的cookie?怎么样?
补充说明:该Cookie将提前一年写入过期日期。
答案 0 :(得分:0)
我发现问题是什么,我假设在没有指定路径的情况下设置cookie会导致会话在该域上的所有路径上运行。 通过使用http://foo.bar/home作为主页并将http://foo.bar/home/css作为样式表,在内部将该URL转换为?s1 = home而?s1 = home& css = y,我实际上根据浏览器使用了两个不同的路径没有将cookie传递给css-request。
出于某种原因,他们事后聚在一起,我不完全理解为什么。
这不是很傻吗?人们通常不会拥有http://foo.bar/index.php和http://foo.bar/css/style.css.php,只是因为他们使用子目录来保持其结构清洁吗?如果有人知道修复它的方法,为了使子路径也可以使用相同的cookie,请告诉我,但据我从cookies的定义中理解它,它们被困在特定的路径中(尽管似乎如果你专门添加一个非/的路径,它也可以在子目录上工作?)