从服务器端指示客户端刷新/警告的最佳实践

时间:2015-06-12 17:22:49

标签: ruby-on-rails ajax sockets caching http-headers

我们使用标准的rails服务器,在每个版本上我们的application.js版本都会根据需要自动更改

如果有新的部署,则页面的标准刷新将获取所需的文件。到目前为止没问题。

现在,我们有一个仪表板,它有一个刷新按钮,可以触发ajax请求(统计/数据)并刷新页面的一部分。无需重新加载页面。但正在发生的事情是有时客户端不会在一天中重新加载页面,在此期间,我们已经部署了以不同方式使用数据的最新代码,以及ajax请求(统计信息/数据),但仍然是有效的URL ,现在在页面上给出了一个奇怪的错误,因为该代码已经过时,数据的使用方式不同。

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

a)想知道我们是否可以在每次部署后使用套接字通知客户需要重新加载页面等

b)我们可以使用http缓存(无验证等)来告知用户该请求不再有效,并且需要重新加载页面。

*甚至不确定它的作用,并且它会起作用。在我们的ajax请求中,它甚至没有进入if块。

application_controller.rb

before_filter :set_cache_buster

  def set_cache_buster
    if request.xhr?
      response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate"
      response.headers["Pragma"] = "no-cache"
      response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT"
    end
  end

欢迎提出任何建议......当我必须告诉我的客户时,看起来非常糟糕,嘿,请刷新它之后可以使用的页面。如果我们做错了什么,请告诉我。

1 个答案:

答案 0 :(得分:1)

底线是您必须以某种方式通知客户需要刷新。你可以通过带有ajax请求发送的标头,带有ajax请求的发送标志,websockets等来实现这一点,但它必须来自某个地方。

另一种方法是让您的客户端或服务器始终向后兼容。我更喜欢这个选项,因为它对客户端的影响最小,但是,当这不可行时,如果我还没有为该api设置websocket服务器,我会选择websockets或ajax请求头。

websocket解决方案的示例流程:

  1. 客户端连接到现有服务器,连接后会收到包含版本号的消息。
  2. 新代码部署到服务器,导致重新启动。
  3. 重启会导致客户端断开连接并重新连接。
  4. 在重新连接时,客户端会再次收到版本号,如果它足够不同,则重新启动*。
  5. *不同,我的意思是,例如,它不需要重新启动1.0.0到1.0.1,但它适用于1.0.0到1.1.0