【问题标题】:Browser GET request returning old images浏览器 GET 请求返回旧图像
【发布时间】:2013-05-15 13:36:03
【问题描述】:

我正在尝试使用 GET 请求从服务器检索图像。图像在不断变化,所以我想每秒抓取几次图像(目的是显示图像并最终模仿视频)。但是,GET 请求出了点问题。无论我尝试获取图像的速度有多快(每 1 秒、100 毫秒等尝试一次),它只会每 5 秒返回一个新图像。就好像某处有一个缓存图像,它只每 5 秒更新一次缓存,其他时间返回旧的、重复的图像。

我已执行以下操作来尝试隔离问题:

  • 已验证服务器端的图像实际上每 100 毫秒左右更新一次,这意味着网页确实为大部分 GET 请求返回了旧图像,
  • 通过开发人员选项和在隐身模式下运行网页来关闭浏览器缓存。顺便说一下,这是 Chrome。
  • 通过在配置文件中设置 maxKeepAliveRequests = 1(禁用)来关闭 Tomcat 服务器中的 keepalive。

然而它实际上仍然只是每 5 秒检索一次新图像。

Example Request Headers:
  Cache-Control: no-cache
  Connection: keep-alive     <-- Could this be the problem? 
  Pragma: no-cache

Example Response Headers:
  Cache-Control: no-cache
  Cache-Control: no-store
  Connection: close
  Pragma: no-cache
  Server: Apache-Coyote/1.1

我的查询(每次加载图片都会延迟一段时间后执行):

document.getElementById("videoDisplay").src = filename + "?random="+(new Date()).getTime();

【问题讨论】:

  • 您是通过自己的服务返回图像吗?也许是一个 Java servlet?
  • 关闭连接保持活跃。另外,你为什么不创建一个 gif 并获取 gif 呢?
  • @PatrickD,文件名是包含实际图像的文件 URL,因此不是真正的服务。然而,它要经过春天才能到达那里。
  • @idipous,我会尝试在浏览器中关闭保持活动状态。我认为这无关紧要,因为服务器已禁用保持活动状态,但绝对值得一试。为什么gif会有所不同?听起来不应该傲慢,我只是不知道什么时候使用什么图像格式以及为什么。
  • 检查 chromes 网络选项卡,如果图像真的被请求并以您认为的速度显示

标签: javascript jquery html image tomcat


【解决方案1】:

http://tomcat.apache.org/tomcat-5.5-doc/config/context.html 找到这个 在那里阅读此条目..

缓存TTL

缓存条目重新验证之间的时间量(以毫秒为单位)。如果未指定,则默认值为 5000(5 秒)。

这可能是你问题的根源

【讨论】:

    【解决方案2】:

    只是想:

    假设您将间隔设置为 500 毫秒。

    您的服务器需要 1 秒来响应请求。

    因此,在等待第一个请求时,超时函数正在同一对象上发出另一个请求。

    这通常会停止第一个请求。

    第二个还没有,所以什么都不会改变。

    等等。

    一段时间后,这将“同步”回退,您将获得任意图像。

    那么,您的服务器的响应时间是多少?

    如果服务器变慢,那么在同一个对象上更新的速度有多快并不重要。

    您可能在加载时锁定了图像,以防止在不等待它们完成的情况下发出请求?

    【讨论】:

    • 好主意,但我可以通过 Chrome 中的网络选项卡看到每个请求的往返时间比轮询间隔快得多,所以不幸的是,在这种情况下这不是问题。
    • 嗯,我很确定这是时间问题。您是否尝试过在 2 秒后只获取一张新图像然后停止?
    • 我不知道 Tomcat 是如何提供图像的,最后是如何在服务器上更新它们的。让我们假设,您只是覆盖了相同的文件 inode,可能 tomcat 已经缓存了内容(在普通文件的某些配置中,apache 也是如此)。这意味着:由于“pragma:no cache”和“expires”的东西,你得到了“新鲜”的内容,但它不是从磁盘中获取的,而是从内部inode缓存中获取的,尽管它是旧的?
    【解决方案3】:

    两个建议:

    • 添加Expires: 标头,设置为几秒前
    • 使用 POST 请求获取数据。获取它意味着检索可能多次获取的内容。 POST 是我为“仅此一次”而设计的

    【讨论】:

      【解决方案4】:

      我曾经尝试做类似的事情,老实说,图像不应该是视频。速度限制为五秒,因此您不会过度使用服务器和 DDOS(至少我是这么认为的,虽然不太确定)。您可以使用 HTML5 标签流式传输视频。您可能会考虑我的好朋友 Google 向我展示的这些网站。
      This is one
      Try this one too

      【讨论】:

        猜你喜欢
        • 2014-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-27
        • 2017-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多