Tomcat 7 对已修改/不存在的资源返回“304 Not Modified”

2024-03-23

我正在开发一个在 Struts2 和 Tomcat 7.0.42 上运行的 Web 应用程序。
我写了一个动态生成jsp文件的action,生成的.jsp,其中包含一些图像引用,并创建包含图像的关联“_files”文件夹。

该操作在另一个页面中调用,请求.html,通过JQuery ajax请求然后加载生成的.jsp带有 JQuery 负载。这请求.html文件看起来像这样:

<HTML>
   <HEAD>

       <script language="javascript">

           $(function() {
               $.ajax({
                  type: "POST",
                   url: "http://..../myAction.action", 
                   data: someDataObj,
                   success: function(msg){
                      $("#myDiv").load("http://.../generated.jsp");
                   });
           }

        </script>
     </HEAD>

    <BODY>
       <div id="myDiv"> </div>
    </BODY>
</HTML>

每次请求时,该操作都会首先删除旧文件,然后生成所有内容。生成的图像取决于 ajax 请求中传递的数据。
The 生成的.jsp页面包含一些指令,使 tomcat 发送响应标头以防止页面被缓存:

<% 
response.setHeader( "Pragma", "no-cache" ); 
response.setHeader( "Cache-Control", "no-cache" ); 
response.setDateHeader( "Expires", 0 ); 
%>

如果我打开请求.html我不经常请求,在请求后等待几秒钟生成的显示页面后,一切都按预期工作:显示页面及其图像。

但是,如果我非常快地执行几个请求,例如每个请求等待不到一秒,我就会看到显示的图像是从旧请求生成的图像。

查看请求和响应标头,当它运行良好时,页面和图像的响应代码始终为“200 OK".
当问题发生时,tomcat 会响应 GET 请求生成的.jsp带有状态代码的页面“200 OK“,但是对其返回的图像的请求”304 未修改" 即使图像文件与上次请求的不同。

有请求/响应标头:

Request URL:http://.../generated.jsp
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:text/html, */*; q=0.01
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,it;q=0.6
Connection:keep-alive
Cookie:JSESSIONID=44E591CE76423F14CCFBE2DF86F50DDE
Host:127.0.0.1:8080
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
X-Requested-With:XMLHttpRequest
Response Headersview source
Cache-Control:no-cache
Content-Type:text/html;charset=ISO-8859-1
Date:Tue, 03 Dec 2013 07:54:05 GMT
Expires:Thu, 01 Jan 1970 00:00:00 GMT
Pragma:no-cache
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked

 

Request URL:http://.../generated.jsp_files/img.png
Request Method:GET
Status Code:304 Not Modified
Request Headersview source
Accept:image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,it;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Cookie:JSESSIONID=300B5CB436CD60BA8E129B21B085A965
Host:127.0.0.1:8080
If-Modified-Since:Mon, 02 Dec 2013 15:31:57 GMT
If-None-Match:W/"1481-1385998317000"
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36
Response Headersview source
Date:Mon, 02 Dec 2013 15:32:00 GMT
ETag:W/"1481-1385998317000"
Server:Apache-Coyote/1.1

我不认为问题是由浏览器缓存引起的,因为请求完成,浏览器只有在收到304状态码后才使用缓存。

我尝试了不同的方法,直到找到解决方法。
首先,我修改了操作以在每次请求、页面和图像时删除旧文件,然后生成所有内容,但没有成功。

然后我尝试每次使用不同的名称生成图像,并将时间戳连接到文件名。
发生的事情是这样的生成的.jsp首先删除,然后在每次请求时参考新图像名称生成。
在这种情况下,当浏览器请求生成的.jsptomcat 返回页面200 OK状态码。当问题发生时,查看页面的来源,我可以看到返回的是带有old图像名称参考。
似乎 tomcat 无法识别文件更改,并且旧图像不再存在,因为在具有旧名称的图像的请求中,它仍然以304状态码。

看到这种行为,我检查 tomcat 工作目录以找到对应于的“java”和“class”文件生成的.jsp我发现这些文件的时间戳早于 webapp 文件夹中包含的页面。

此时我尝试了另一种解决方法:使操作删除 tomcat 的工作子文件夹,其中包含生成的.jsp相关文件。
即使这次尝试失败了,与接收旧版本的浏览器的行为相同生成的.jsp页面和图像的 304 状态代码。

唯一的解决方法是删除 webapp 文件夹中的旧页面并使用不同的名称创建页面,就像我对图像所做的那样。

我在文档中读到,Tomcat 会在每次请求时检查资源是否被修改,除非其中的某些属性web.xml被改变。
看到这种行为,我相信 tomcat 使用一些缓存来进行检查,并且不会每次都在文件系统上执行该检查,但我在文档中没有找到任何内容。

有人知道我是否错了,也许可以帮助我理解这些机制在 Tomcat 中是如何工作的?


Tomcat 在服务器上缓存内容,因此修改运行时可用的资源会给您带来麻烦。你将在余下的职业生涯中尝试解决所有问题,并在这个过程中变得疯狂。抱歉,您需要重新考虑您的方法。

为什么不直接从 servlet 每次 100% 动态地服务请求,而不是在每个请求上生成代码等?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Tomcat 7 对已修改/不存在的资源返回“304 Not Modified” 的相关文章

随机推荐

  • 如何在Linux中安装chrome(无头)

    我有一个运行 linux redhad 的 AWS EC2 有没有办法在上面安装最新的 Chrome v59 以便我可以像 PhantomJS 一样以无头模式运行它 我在 google 上能找到的所有资源都是关于如何在有 UI 的 ubun
  • 无法转换“UICollectionViewCell”类型的值

    我在 Storyboard 中使用自定义 CollectionViewCell 当我启动应用程序时 我收到以下消息 无法将 UICollectionViewCell 类型的值转换为 TestProject CollectionViewCel
  • 框架在不同时间绘画? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我的游戏中有一个非常烦人的错误 帧的底部似乎比帧的顶部渲染得更早 我不确定为什么会发生这种情况 我正在使用 JPanel
  • Python 的 bool 值是按值传递的吗?

    我发送了对 bool 对象的引用 并在方法中修改了它 方法执行完毕后 方法外的bool值没有变化 这让我相信 Python 的 bool 是按值传递的 真的吗 还有哪些其他 Python 类型有这样的行为 Python 变量不是 C 意义上
  • Pip 安装日志在哪里?

    为什么 pip 不记录何时安装了哪个版本的库 如果您将库更新为损坏的版本怎么办 你怎么知道哪个版本没有被破坏 那些对此投赞成票的人 你能告诉我你为什么这样做吗 运行 pip 时 您可以指定日志文件 这样您就可以在将来跟踪安装日志 pip i
  • n最大和n最小;堆Python

    这是出于对 python 中 heapq py 模块的 nsmallest 和 nlargest 方法的好奇 我正在读它here https docs python org 2 library heapq html 在文档中 文档没有说明它
  • 按类型组合连续日期时间间隔

    假设我们有这样一个表 declare periods table s date e date t tinyint 日期间隔无间隙 按开始日期排序 insert into periods values 2013 01 01 2013 01 0
  • 如何在 Typescript 中启用 NodeJS 和 ExpressJs

    我希望找到一个适用于 Node 和 Express 的 d ts 文件 这将在打字稿中启用 Intellisense 到目前为止 我已经尝试使用此处提供的 Node d ts 文件 https github com borisyankov
  • Maven 快照到底是什么以及我们为什么需要它?

    我对 Maven 快照的含义以及我们为什么要构建一个有点困惑 Maven 中的快照版本是尚未发布的版本 这个想法是before a 1 0发布 或任何其他发布 完成后 存在1 0 SNAPSHOT 那个版本是什么可能会成为 1 0 基本上就
  • 一台服务器向 Android 和 iOS 设备发送推送通知

    我们的组织有一个 Android 应用程序和一个 iOS 应用程序 我们希望开始向这些应用程序推送通知 安卓有GCM 苹果有APNS 但我们想要创建一个可以在 Android 和 iOS 上运行的 API 设置服务器的最简单方法是什么 以便
  • 反应式香蕉中的动态事件切换导致严重泄漏

    我不确定这种行为是预期的 即我误用了 Reactive Banana Switch 还是错误 假设我有两个类似类型的输入行为 并且我想根据事件在它们之间进行切换 我写了这个函数 switchBehaviors Behavior t a Be
  • 从 WCF 服务抛出FaultException 会导致“此故障的创建者未指定原因”。

    当投掷一个FaultException
  • 从 openapi-generator 生成提示登录时添加行 import openapiclient "github.com/GIT_USER_ID/GIT_REPO_ID"

    我正在使用 openapi 生成器来生成我的其余 api 客户端 它生成行 openapiclient github com GIT USER ID GIT REPO ID 在我的进口中 但我一生都无法理解为什么 运行一个go mod ve
  • CONN_MAX_AGE 在 Django 中如何工作

    有人可以 ELI5 CONN MAX AGE 做什么吗 我认为它是这样工作的 1 请求 1 进入 打开到数据库的连接 1 2 请求 1 使用连接 1 来做一些工作 3 请求 1 完成 由于 CONN MAX AGE 不为零 并且尚未达到期限
  • Typescript 类型的递归子集

    在 Typescript 中是否可以创建与此类似的类型子集 type Schema user name string age number profile isCool boolean const wantedSubset user nam
  • 加速 Google App 脚本/Javascript 和递归

    我正在 Google App Script 中为 Google Sheet 编写一组脚本 我创建了一个用户界面来为 Google Sheet 提供网页体验 充当论坛 我以递归模式将讨论存储在电子表格中 如下所示 ID Parent ID T
  • 什么是 LLDB RPC 服务器? Xcode什么时候会崩溃?为什么会崩溃?

    我在调试器中收到一条消息 LLDB RPC 服务器已崩溃 崩溃日志位于 Library Logs DiagnosticReports 中 并具有前缀 lldb rpc server 请提交错误并附上最新的崩溃日志 就我而言 每次运行应用程序
  • Scala,未来的java(?)[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • StackExchange.Redis 简单 C# 示例

    我正在寻找一个非常简单的 C 入门应用程序来使用 StackExchange Redis 我在网上搜索并发现StackExchange Redis https github com StackExchange StackExchange R
  • Tomcat 7 对已修改/不存在的资源返回“304 Not Modified”

    我正在开发一个在 Struts2 和 Tomcat 7 0 42 上运行的 Web 应用程序 我写了一个动态生成jsp文件的action 生成的 jsp 其中包含一些图像引用 并创建包含图像的关联 files 文件夹 该操作在另一个页面中调