"重新打开最后一个关闭的选项卡“;导致显示最后一个ajax请求内容

"Re open last closed tab" causing to show last ajax request content

本文关键字:最后一个 显示 ajax 请求 选项 新打开 quot      更新时间:2023-09-26

当ajax请求发生时,我使用HTML5历史api来保存状态,如果用户请求同一页面,而没有ajax请求,我会提供完整的HTML内容。

浏览器的"重新打开最后一个关闭的选项卡"功能在不影响服务器的情况下带来最后一个ajax请求内容。如果浏览器在不带最后请求内容的情况下进行请求,那么一切都会顺利进行。但浏览器只显示最后一个ajax请求的内容。

我在Chrome 17和Firefox 10上都有过这种体验。(我没有在ie9上尝试过,因为它没有支持历史api)

这个问题的解决方案是什么?

编辑:这些ajax请求只是对服务器的"获取"请求。

在jsfiddle.net中演示它确实是不可能的,原因很少。您可以在本地主机中演示它,如下所示。

向服务器发出"get"请求并提取json对象,然后将该url推送到历史api中,如下所示。

history.pushState(null,null,url);

然后关闭该选项卡,然后单击浏览器的"重新打开上次关闭的选项卡"功能。你看到了什么?Json响应机构?浏览器显示它而不向服务器发出请求,对吗?

问题是由http响应标头引起的。标头包含ajax请求的可缓存信息,所以浏览器显示缓存中的url内容,而不会命中数据库。

从响应头中删除缓存参数后,浏览器就可以在不从缓存中获取内容的情况下访问服务器。

当您重新打开一个关闭的选项卡时,浏览器可以重用给定URL的缓存数据来填充窗口。由于缓存中的数据来自ajax请求响应,所以它就是这样使用的,您可以看到JSON。

这就引出了一个问题:为什么浏览器在满足ajax请求时不使用缓存中的HTML?浏览器使用不同的规则来决定是否使用缓存内容,这取决于他们正在做什么。在这种情况下,Chrome似乎很乐意在恢复最近关闭的选项卡时重用它,而不是在执行ajax请求时。

您可以通过告诉浏览器永远不要缓存响应来纠正它。这是否可取取决于您的用例。

例如,在文件顶部插入这些内容(当然是在打开<?php标签之后)对我来说不会发生这种情况:

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

这完全取决于您使用的浏览器以及启用的优化。

例如,谷歌Chrome会将页面保存在内存中,所以当你反击并将其转到新网站时,或者当你重新打开关闭的选项卡时,它会从内存中恢复页面。

较旧/较慢的浏览器只会刷新任何内容。

尽管这应该不是一个真正的问题,因为您的javascript状态也应该恢复——当他们重新打开该页面时,在各个方面都应该完全相同。