我正在开发一个在Struts2和Tomcat 7.0.42上运行的Web应用程序 我写了一个动作,在动态生成一个jsp文件, generated.jsp ,其中包含一些图像引用,并创建包含图像的关联“_files”文件夹。
通过JQuery ajax请求在另一个页面 request.html 中调用该操作,然后使用JQuery加载加载 generated.jsp 。 request.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会回复 generated.jsp 页面的GET请求,状态代码为“ 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状态代码后才使用缓存。
我尝试过不同的东西,直到找到解决方法 首先,我已经修改了在每个请求,页面和图像中删除旧文件的操作,然后生成所有内容,但没有成功。
然后我尝试使用不同的名称生成图像,将时间戳连接到文件名。
发生的事情是 generated.jsp 首先被删除,然后在每次请求时引用新图像名称生成。
在这种情况下,当浏览器请求 generated.jsp 时,tomcat返回带有 200 OK 状态代码的页面。当问题出现时,查看页面的来源,我可以看到返回的是带有旧图像名称引用的页面。
似乎tomcat无法识别文件更改并且旧图像不再存在,因为在具有旧名称的图像请求时,它仍然以 304 状态代码回答。
看到这种行为,我检查了tomcat的工作目录,找到了与 generated.jsp 对应的“java”和“class”文件,我发现这些文件的时间戳早于该页面所包含的页面webapp文件夹。
此时我尝试了另一种解决方法:使操作删除包含 generated.jsp 相关文件的tomcat的工作子文件夹。
即使此尝试失败,浏览器接收旧的 generated.jsp 页面和图像的304状态代码也会出现相同的行为。
唯一可行的解决方法是删除webapp文件夹中的旧页面并使用不同的名称创建页面,就像我对图像所做的那样。
我在文档中读到,如果资源被修改,Tomcat会在每次请求时检查,除非 web.xml 中的某些属性发生更改。
看到这种行为我相信tomcat使用一些缓存来进行检查,并且每次都没有在文件系统上执行此操作,但我在文档中没有找到任何内容。
有人知道我是不是错了,也许可以帮助我理解这些机制在Tomcat中的运作方式吗?
答案 0 :(得分:2)
Tomcat在服务器上缓存内容,因此在运行时修改可用资源会让您遇到麻烦。你将在余下的职业生涯中尝试解决所有的问题并在此过程中疯狂。对不起,你需要重新思考你的方法。
不是在每个请求上生成代码等,为什么不直接从servlet每次100%动态地提供请求?