草庐IT

javascript - 站点更新后强制浏览器重新加载所有缓存

coder 2024-07-15 原文

在服务器被推送更新到代码库后,有没有办法强制网页的客户端重新加载缓存(即图像、javascript 等)?我们接到很多帮助台电话,询问为什么某些功能不再有效。一个简单的硬刷新解决了问题,因为它下载了最新更新的 javascript 文件。

具体而言,我们使用的是 Glassfish 3.x。和 JSF 2.1.x。当然,这不仅仅适用于 JSF。

描述我希望可能发生的行为:

网站 A 有两个图像和两个 javascript 文件。用户访问该站点,这 4 个文件被缓存。就我而言,除非用户特别强制“硬”刷新或清除缓存,否则无需“重新下载”所述文件。一旦站点被推送到其中一个文件的更新,服务器可以在 header 中包含某种元数据,通知客户端所述更新。如果客户选择,将下载新文件。

我不想做的是将元标记放在页面的标题中以强制缓存任何内容...我只想要告诉客户端已发生更新并且它应该获取最新的东西一旦更新了某些内容。我想这只是客户端的某种版本控制。

感谢您的宝贵时间!

最佳答案

处理此问题的正确方法是更改​​资源的 URL 约定。例如,我们将其作为:

/resources/js/fileName.js

要让浏览器仍然缓存文件,但通过版本控制以正确的方式执行,是向 URL 添加一些内容。给querystring加一个值不允许缓存,所以放的地方在/resources/之后.

查询字符串缓存引用:http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.9

例如,您的网址如下所示:

/resources/1234/js/fileName.js

所以你可以做的是使用项目的版本号(或者当你想要重新加载缓存文件时你手动更改的属性/配置文件中的一些值)因为这个数字应该只改变修改项目时。所以您的网址可能如下所示:

/resources/cacheholder${project.version}/js/fileName.js

这应该很简单。

现在的问题是映射 URL,因为中间的值是动态的。我们克服这个问题的方法是使用 URL 重写模块,该模块允许我们在 URL 到达我们的应用程序之前对其进行过滤。重写监视看起来像这样的 URL:

/resources/cacheholder______/whatever

并删除了 cacheholder_______/部分。重写后,它看起来像一个正常的请求,服务器将以正确的文件响应,没有任何其他特定的映射/逻辑……关键是浏览器认为它是一个新文件(即使它真的不是' t),所以它请求了它,服务器计算出来并提供了正确的文件(即使它是一个“奇怪的”URL)。

当然,另一种选择是将这个动态字符串添加到文件名本身,然后使用重写工具将其删除。无论哪种方式,都完成了同样的事情——在重写期间以文本字符串为目标,并将其删除。这允许你欺骗浏览器,而不是服务器:)


更新:

我真正喜欢的另一种方法是根据内容设置文件名,然后缓存它。例如,这可以用散列来完成。当然,这种类型的事情不是您手动执行并保存到您的项目中的(希望如此);这是您的应用程序/框架应该处理的事情。例如,在 Grails 中,有一个“散列和缓存”资源的插件,因此会发生以下情况:

  • 检查每个资源
  • 创建一个新文件(或映射到该文件),名称是其内容的哈希值
  • 添加<script>时/<link>标记到您的页面,使用散列名称
  • 当哈希命名的文件被请求时,它提供原始资源
  • 以散列命名的文件“永久”缓存

此设置的妙处在于,您不必担心缓存是否正确 - 只需将文件设置为永久缓存,哈希处理应根据内容处理可用的文件/映射。它还提供了已缓存和快速加载回滚/撤消的能力。

关于javascript - 站点更新后强制浏览器重新加载所有缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15936050/

有关javascript - 站点更新后强制浏览器重新加载所有缓存的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  4. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

    我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

  5. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  6. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  7. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  8. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

  9. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  10. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

随机推荐