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

为什么Chrome会报告过时的响应头?

陆晓博
2023-03-14

使用TomCat为网站提供服务。通常,当我更新网站时,Chrome会对缓存感到困惑,并继续使用缓存中的旧页面,即使新的页面可用。这似乎是基于一个更基本的问题,Chrome也没有从服务器获得最新的响应头,这似乎阻止了任何控制缓存的能力。

我选择了一个javascript文件,做了一个小的修改来更改文件系统中文件的日期。然后我用Mozilla和Chrome重新蚀刻了页面。Mozilla似乎运行正常:服务器返回200,最重要的是,最后修改的头显示的内容与文件上的时间戳相同。

然而,Chrome,我得到了最奇怪的回应。它声称获得200响应,但不刷新缓存。根据Chrome,上次修改的标题是几个月前的!我在提供文件的非常基本的模式中使用TomCat——没有涉及我的特殊代码。我真的不相信TomCat会向Chrome返回不同的标题。

看起来Chrome甚至从未询问过服务器。我在服务器上找不到该文件请求的任何记录。Chrome似乎只是在处理缓存文件,从几天前的获取中报告旧的头文件。它没有向服务器请求头,也没有向服务器发送消息。它只是不调用服务器。

我从一个HTTP测试工具中进行了第三次抓取,该工具报告返回的标头。以这种方式检索的标头与Mozilla报告的标头匹配,但与Chrome报告的标头不匹配。Chrome似乎缓存了之前的标头响应,因此没有下载修改的文件。

甚至ETag头也不同。Mozilla和测试工具报告了一个W/"464427-1517160284971"的ETag标头,然而Chrome声称响应包括W/"464400-1511152262000"的ETag值。我只是不相信服务器返回了那个值。

我一直在努力解决用户必须清除Chrome上的缓存,这是一个真正的问题。有什么方法可以在页面修改时强制Chrome刷新缓存,而不会破坏每个人的网络性能。

以下是Mozilla头文件

以下是Chrome“报告”标题

这是测试工具头。

共有1个答案

巢烨
2023-03-14

解决方案似乎是将选项必须验证添加到缓存控制响应头中。如果没有这个头,并且没有其他特定的基于时间的命令来释放缓存的文件,Chrome将永远缓存该文件,并且不会返回服务器并检查是否有更新的文件。

默认情况下,Apace TomCat在响应的缓存控制标题中不包含必须验证。这就是为什么使用TomCat上的默认设置,Chrome将永远缓存文件。这很奇怪,因为它看起来像是获取了文件,但它没有,并且它报告了几天前检索文件时的HTTP响应(200)。

在TomCat中,向响应添加标头的唯一方法是编写一个对每个请求都这样做的类。这里有一个合适的类:

public class HeaderCorrectingFilter implements Filter {

    public void destroy() {
        //nothing to destroy
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        ((HttpServletResponse) response).setHeader("Cache-Control", "must-revalidate");
    }

    public void init(FilterConfig arg0) throws ServletException {
    }

}

下面是WEB中的设置。XML,以使其被调用

<filter>
  <filter-name>HeaderCorrectingFilter</filter-name>
  <filter-class>com.example.HeaderCorrectingFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>HeaderCorrectingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

下面是一篇博客文章,详细介绍了如何制作

 类似资料:
  • 请问为什么第13行的错误是未报告的异常,必须捕获pr声明要抛出

  • 问题内容: 我无法使用RestTemplate(org.springframework.web.client.RestTemplate)应对额外的弹簧行为,但没有成功。 我在代码下面的Hole应用程序中使用,并且始终会收到XML响应,该响应会解析并评估其结果。 但是无法确定为什么执行后服务器响应为JSON格式: 我已经在较低级别的RestTemplate上进行了调试,内容类型为XML,但是不知道为

  • 前段时间,我设置了一个带有一些子域的站点(,...) 为什么辅助DNS没有给出子域的答案?它给出了像“test.example.com”这样的旧子域的答案。我必须如何解释SOA响应?什么意思?

  • 对于特定的gatling负载测试模拟,我们将一些数据标准化并临时存储在redis中,以便为每个请求提供模拟场景。这些数据是使用我们的模拟gatling/scala代码中的redis数据馈送器API检索的。我们在单独的服务器上运行redis。我很好奇gatling结果报告中报告的响应时间是否包括在模拟期间构建和执行的每个请求从redis中弹出的每个记录的响应时间。

  • 我正在尝试为Rest-Assured(RESTful API)生成cucumber报告,并且我还热衷于捕获cucumber报告中的请求/响应。我想知道是否有人已经实现了这一点或可以提供一些指示。

  • 问题内容: 请问为什么第13行中的错误是未报告的异常,必须在声明声明为pr的情况下将其捕获 问题答案: 您需要向引发异常的方法中添加一个,如上所述,以及调用该方法的所有方法