我遇到问题的应用程序是一个通用的Web应用程序......它处理用户的方式没什么特别之处。也就是说,我在会话变量中处理用户信息,通过cookie管理会话。
我的客户端遇到了一个问题,即用户已登录,并且每次都会向他们显示不同用户的页面(这很容易确定,因为用户的名字位于每个页面的顶部) 。如果他们点击“主页”链接,显然一切都很好。
现在就我的PHP知识而言,将这种事情混合起来还需要一些努力,对吧?我不能在任何开发环境中复制这个问题,就我而言,就像我说的那样,实际上“分享”这种会话信息需要付出一些努力......
所以我的问题是:可能出现的问题是什么?每次我遇到这种情况之前都是由于“行为不端”的代理服务器,尽管他们告诉我他们没有代理请求。
还有什么我可能会遗失的吗?任何其他可能的原因(当然这可能包括我的代码问题)?
...谢谢
答案 0 :(得分:2)
通过它的声音,即使你的客户向你保证它不是,它仍然似乎是我的代理或缓存问题。如果可能的话,您可以在用户字段附近的某个位置生成页面时添加类似时间戳的内容,以确保请求是最新的。
这样一来,如果页面混乱,你就会有一些迹象表明页面是否是先前生成的并且是在途中存储的。如果您的ajax结果被浏览器缓存,并且您的客户端在同一个Web浏览器上有多个人,则不需要代理就可以获得古怪的结果。
您可以解决此问题的另一种方法是记录来自客户端的请求,并检查您是否遗漏了任何内容。如果你回放请求,你会得到相同的结果吗?
您是否可以验证当您以用户A身份登录,并且“错放”了您的会话cookie(删除它)时,您是否仍可以获得所需的信息?如果是这样,处理身份验证的方式可能有问题。
希望这有帮助!
答案 1 :(得分:2)
事实证明,这个情况的最终结果至少是相当古怪的。
事实证明,客户端正在使用掌上电脑访问应用程序并让电池耗尽。这个特定的设备然后将其时钟重置为2005年,当电池最终充电时,似乎这导致浏览器从其缓存中读取某些页面。
只要设备上的时钟设置正确,问题就会消失。
感谢大家的建议:我讨厌尝试调试这些缓存类型问题。我想,我真的应该添加一些标题来尝试阻止这些手持设备缓存数据。
答案 2 :(得分:1)
您可能需要考虑进行某种会话验证,例如在会话中存储IP地址并在会话中的地址与当前用户的IP不匹配时销毁它。
当然,如果IP不匹配,您可以只为用户强制执行新会话,而不是销毁它。我认为这样的事情会起作用:
session_start();
if (isset($_SESSION['ip'])) {
if ($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) {
session_regenerate_id();
session_destroy();
session_start();
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}
} else {
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
}
答案 3 :(得分:0)
您是在向用户展示其中包含会话ID的链接(或将会话ID作为参数的其他请求)吗?