【问题标题】:Tomcat 7 returns "304 Not Modified" on modified/non existent resourceTomcat 7 在已修改/不存在的资源上返回“304 Not Modified”
【发布时间】:2013-12-22 05:18:36
【问题描述】:

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

通过 JQuery ajax 请求在另一个页面 request.html 中调用该操作,然后通过 JQuery 加载加载 generated.jsprequest.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 请求中传递的数据。
generated.jsp页面包含一些指令让tomcat发送响应头来防止页面被缓存:

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

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

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

查看请求和响应标头,当它运行良好时,页面和图像的响应代码始终为“200 OK”。
当问题发生时,tomcat 以状态码“200 OK”回答 generated.jsp 页面的 GET 请求,但它返回的图像请求为“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状态码后才使用缓存。

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

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

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

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

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

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

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

【问题讨论】:

  • 我已从 caching 重新标记为 tomcat,以更具体并覆盖更广泛的受众。从来没有想过动态生成 JSP 顺便说一句...直接生成 HTML 文件不是更容易吗?
  • 是的,但在第一次尝试后,我认为这是浏览器缓存问题,所以我在 jsp 中添加了指令以不缓存页面,添加 META 标记指令等。顺便说一句,生成的 html 有同样的问题..
  • 生成的 HTML 不应由 AS 编译。还是在生成 JSP 后手动编译它们?我想(编译时间)可能是双击搞砸事情的机会之窗。也许在第一次编译他时访问 JSP 文件(从第二次单击)将中止第二次编译...
  • 是的,这确实有道理,我会尽快尝试再次生成纯 HTML 页面。顺便说一句,我不会手动重新编译生成的 jsp。谢谢你的建议:)

标签: java http tomcat struts2 tomcat7


【解决方案1】:

Tomcat 在服务器上缓存东西,所以在运行时修改可用资源会给你带来麻烦。您将在余下的职业生涯中努力解决所有问题,并在此过程中发疯。很抱歉,您需要重新考虑您的方法。

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

【讨论】:

    猜你喜欢
    • 2016-03-29
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2012-08-04
    • 2014-11-11
    • 2023-02-12
    相关资源
    最近更新 更多