如何使浏览器停止缓存GWT nocache.js
我正在使用GWT开发一个web应用程序,我发现浏览器中的如何使浏览器停止缓存GWT nocache.js,gwt,browser-cache,lighttpd,Gwt,Browser Cache,Lighttpd,我正在使用GWT开发一个web应用程序,我发现浏览器中的app.nocache.js文件缓存存在一个疯狂的问题,即使web服务器发送了该文件的新副本 我正在使用Eclipse编译该应用程序,它在开发模式下工作。为了测试生产模式,我有一个虚拟机(Oracle VirtualBox),在我的主机(Windows 7)上运行一个Ubuntu来宾操作系统。我正在VM中运行lighttpd web服务器。VM正在共享我的项目的war目录,web服务器正在为该目录提供服务 我使用Chrome作为浏览器,但F
app.nocache.js
文件缓存存在一个疯狂的问题,即使web服务器发送了该文件的新副本
我正在使用Eclipse编译该应用程序,它在开发模式下工作。为了测试生产模式,我有一个虚拟机(Oracle VirtualBox),在我的主机(Windows 7)上运行一个Ubuntu来宾操作系统。我正在VM中运行lighttpd web服务器。VM正在共享我的项目的war目录,web服务器正在为该目录提供服务
我使用Chrome作为浏览器,但Firefox中也出现了同样的情况
以下是场景:
- 应用程序的网页为空。根据Chrome的“Inspect Element”工具,这是因为它正在尝试获取不存在的
(6E89D5C912DD8F3F806083C8AA626B83.cache.html
)404未找到
- 我检查了war目录,果然,该文件不存在
- 浏览器上的
已从web服务器(200 OK)重新加载,因为服务器上的文件比浏览器缓存更新。我验证了服务器返回的新文件的文件大小和时间戳是否正确。(这是关于服务器HTTP响应的信息报告)app.nocache.js
- 但是,如果我在浏览器上打开
,javascript指的是app.nocache.js
!!!也就是说,即使web服务器发送了一个新的6E89D5C912DD8F3F806083C8AA626B83.cache.html
,浏览器似乎忽略了这一点,并继续使用其缓存副本app.nocache.js
- 转到Google->GWT在Eclipse中编译。重新编译整个过程
- 在war目录中验证
是否被覆盖并具有新的时间戳app.nocache.js
- 从Chrome重新加载页面,并再次验证服务器是否向
发送了200 OK响应app.nocache.js
- 浏览器再次尝试加载
,但失败。浏览器仍在使用6E89D5C912DD8F3F806083C8AA626B83.cache.html
的旧缓存副本app.nocache.js
- 在war目录中绝对确定没有任何内容引用
(通过查找和grep)6E89D5C912DD8F3F806083C8AA626B83.cache.html
nocache.js
文件
以下是在浏览器中单击“重新加载”时HTTP请求/响应标题的副本。在此跟踪中,自上次获取后,服务器内容尚未重新编译(但请注意,nocache.js的缓存版本仍然错误!):
- 浏览器上的app.nocache.js已从web服务器重新加载(200确定),因为服务器上的文件比浏览器缓存更新。我验证了服务器返回的新文件的文件大小和时间戳是否正确。(这是关于服务器HTTP响应的信息报告)
所以Chrome可能仍然使用旧版本。它可能很久以前就决定不再需要重新加载资源。清除缓存应该可以解决这个问题。然后确保在重新加载页面之前设置正确的缓存头,请参见,例如,避免浏览器缓存的最佳方法是将过期时间设置为现在,并添加max age=0和必须重新验证控件 这是我在ApacheHTTPD中使用的配置
ExpiresActive on
<LocationMatch "nocache">
ExpiresDefault "now"
Header set Cache-Control "public, max-age=0, must-revalidate"
</LocationMatch>
<LocationMatch "\.cache\.">
ExpiresDefault "now plus 1 year"
</LocationMatch>
有两个简单的解决方案(第二个是第一个的修改版本) 1) 将引用*.nocache.js的*.html文件重命名为MyProject.html,即将MyProject.jsp重命名为MyProject.jsp 现在在MyProject.html中搜索*.nocache.js脚本的位置
<script language="javascript" src="MyProject/MyProject.nocache.js"></script>
添加一个动态变量作为JS文件的参数,这将确保每次都从服务器返回实际内容。下面是一个例子
<script language="javascript" src="MyProject/MyProject.nocache.jsp?dummyParam=<%= "" + new java.util.Date().getTime() %>"></script>
说明:dummyParam将不起作用,但将获得我们的预期结果,即将返回200代码而不是304代码
注意:如果要使用此技术,则需要确保指向正确的jsp文件以加载应用程序(在此更改之前,您使用HTML文件加载应用程序)
2) 如果您不想使用JSP解决方案,并且希望继续使用html文件,那么您将需要java脚本在加载nocache文件时在客户端动态添加唯一的参数值。考虑到上述解决方案,我认为这对你来说应该不是什么大问题
我成功地使用了第一种技术,希望这会有所帮助。在通过Apache阻止缓存失败后,我创建了一个bash脚本,root在我的Linux Tomcat服务器上的cron作业中每分钟运行一次
#!/bin/bash
#
# Touches GWT nocache.js files in the Tomcat web app directory to prevent caching.
# Execute this script every minute in a root cron job.
#
cd /var/lib/tomcat7/webapps
find . -name '*nocache.js' | while read file; do
logger "Touching file '$file'"
touch "$file"
done
我们也有类似的问题。我们发现nocache.js的时间戳没有用gwt compile更新,所以在构建时必须接触该文件。然后我们还应用了@Manolo Carrasco Moñino的修正。我写了一篇关于这个问题的博客
评论还指出,我们使用的是GWT的2.7版。在cognito模式下打开页面,只是为了消除缓存问题并解除自己的阻塞
您需要像其他人的评论中提到的那样配置缓存时间。顺便说一句,这似乎与类似,但它没有包含任何帮助我解决此问题的信息。您阅读了吗?是的,似乎发生了正确的事情,因为该页面显示“如果已修改,因为获取已足够”。我可以从Chrome Inspect Element工具中看出,浏览器在GET请求中发送了“If Modified Since:Thu,2012年10月25日17:03:53 GMT”,服务器响应为“Last Modified:Thu,2012年10月25日17:55:26 GMT”
<script language="javascript" src="MyProject/MyProject.nocache.jsp?dummyParam=<%= "" + new java.util.Date().getTime() %>"></script>
#!/bin/bash
#
# Touches GWT nocache.js files in the Tomcat web app directory to prevent caching.
# Execute this script every minute in a root cron job.
#
cd /var/lib/tomcat7/webapps
find . -name '*nocache.js' | while read file; do
logger "Touching file '$file'"
touch "$file"
done