当前位置: 首页 > 知识库问答 >
问题:

为什么从Vue.js的挂载钩子发送的AJAX GET请求总是忽略浏览器缓存?

张砚
2023-03-14

我在Vue组件中为我的AJAX请求使用Axios,并注意到(在页面刷新后)对缓存endpoint的请求被发送到服务器,而不是在从挂载钩子调用时命中缓存。每个其他请求都正确地命中浏览器缓存。

当我将第二个请求移动到中时,我有两个(不同的)请求被从挂载的钩子中分派。然后(),它开始命中浏览器缓存。

是什么导致了这种行为?如何从挂载挂钩内的缓存加载页面数据?

编辑:在Firefox中可以看到这种行为。在新选项卡中粘贴请求URL将正确加载浏览器缓存中的数据。我还没有找到一个解决方案来强制请求遵守挂载钩子中Vue代码中的缓存控制。

共有1个答案

张照
2023-03-14

TL,DR;
要正确测试页面的客户端缓存,请将URL复制/粘贴到新选项卡中,而不是点击F5

为什么?

作为开发人员,当用户点击刷新时会发生什么并不完全取决于您。这也取决于浏览器制造商。

如果您正在寻找一种方法,禁止浏览器在其版本(根据缓存控制服务器端设置)仍然有效的情况下加载新数据,则没有这种方法。

这取决于浏览器制造商猜测用户真正想要什么并提供它。平均而言,如果猜测正确,他们的市场份额就会上升。当错误发生时,它会下降。显然,你没有发言权。

你也应该考虑到绝大多数的网站拥有者不知道如何调整缓存控制,也不需要花钱为他们做一些事情,所以他们只是默认了。因此,为了让用户满意,浏览器制造商需要正确猜测用户何时需要更新内容,即使服务器说内容足够新鲜。

换句话说,您不能强制执行客户端缓存(但可以强制执行服务器端缓存!)。你只能提出建议。如果浏览器制造商有理由相信用户需要“清除缓存和硬重新加载”,但技术水平不足以执行,他们会在简单刷新时执行。

Chrome基于大量的使用数据,试图猜测页面的“主缓存”是什么,“辅助缓存”是什么。它试图在提供新内容(通过清除该页面的主缓存)和及时提供新内容(通过不清除辅助缓存)之间取得平衡。我相信在同一个域上由一个以上页面加载的任何资源都被标记为“次要”,尽管我猜算法比这更聪明。

据我所知,Firefox没有多种刷新类型,因此,如果用户点击“刷新”,则所述页面的所有缓存都将消失。

 类似资料:
  • 我正在探索HTTP Origin检查作为Drupal在https://www.drupal.org/node/1803712的CSRF保护的想法 现在我正在测试Origin头是如何通过POST请求到达的,但是Firefox不会在用户登录表单提交上发送Origin头。Chromium和Chrome工作正常,他们发送Origin头。 Firefox版本是36.0.1。我还用一个干净的Firefox安装

  • 我的前端代码: 和我的Express.js服务器代码: 如您所见,Express服务器在端口8000上运行,React开发服务器在端口3000上运行。正在请求,并且正在通过使用POST方法请求另一个源。但是,只有第二个请求工作得很好。我不知道怎么会这样。当然,如果我用querystring发出GET请求,事情就正常了。但我也想知道如何用请求正文进行POST获取。

  • 我最近一直在用Java编写自己的Webserver,因为我觉得有一个很不错,昨天我偶然发现了一个问题,我仍然没有解决。我的浏览器(取消搜索Chromium)似乎向服务器发送了一些空请求或类似的东西。我实现了一个请求处理程序,它应该读取GET请求并提取请求的资源。它的工作原理是这样的:它以请求为例:“GET/index.htmlHTTP/1.1”并将其放入带有String.split (" ");

  • 本文向大家介绍浅谈Ajax请求与浏览器缓存,包括了浅谈Ajax请求与浏览器缓存的使用技巧和注意事项,需要的朋友参考一下 在现代Web应用程序中,前端代码充斥着大量的Ajax请求,如果对于Ajax请求可以使用浏览器缓存,那么可以显著地减少网络请求,提高程序响应速度。 1. Ajax Request 使用jQuery框架可以很方便的进行Ajax请求,示例代码如下: 非常简单,注意其中的第4行代码:ca

  • 本文向大家介绍浏览器中window.length的结果是什么?为什么?相关面试题,主要包含被问及浏览器中window.length的结果是什么?为什么?时的应答技巧和注意事项,需要的朋友参考一下 神奇的问题,神奇的答案

  • 本文向大家介绍基于Python模拟浏览器发送http请求,包括了基于Python模拟浏览器发送http请求的使用技巧和注意事项,需要的朋友参考一下 1.使用 urllib2 实现 2.使用 requests 模块 (1).get请求 (2).post请求 (3).使用session对象的写法 3.其他的一些请求方式 >>> r = requests.put("http://httpbin.org/