Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使浏览器停止缓存GWT nocache.js_Gwt_Browser Cache_Lighttpd - Fatal编程技术网

如何使浏览器停止缓存GWT nocache.js

如何使浏览器停止缓存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

我正在使用GWT开发一个web应用程序,我发现浏览器中的
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目录,果然,该文件不存在
  • 浏览器上的
    app.nocache.js
    已从web服务器(200 OK)重新加载,因为服务器上的文件比浏览器缓存更新。我验证了服务器返回的新文件的文件大小和时间戳是否正确。(这是关于服务器HTTP响应的信息报告)
  • 但是,如果我在浏览器上打开
    app.nocache.js
    ,javascript指的是
    6E89D5C912DD8F3F806083C8AA626B83.cache.html
    !!!也就是说,即使web服务器发送了一个新的
    app.nocache.js
    ,浏览器似乎忽略了这一点,并继续使用其缓存副本

  • 转到Google->GWT在Eclipse中编译。重新编译整个过程

  • 在war目录中验证
    app.nocache.js
    是否被覆盖并具有新的时间戳
  • 从Chrome重新加载页面,并再次验证服务器是否向
    app.nocache.js
    发送了200 OK响应
  • 浏览器再次尝试加载
    6E89D5C912DD8F3F806083C8AA626B83.cache.html
    ,但失败。浏览器仍在使用
    app.nocache.js
    的旧缓存副本
  • 在war目录中绝对确定没有任何内容引用
    6E89D5C912DD8F3F806083C8AA626B83.cache.html
    (通过查找和grep)
出什么事了?为什么即使服务器发送新副本,浏览器也会缓存此
nocache.js
文件


以下是在浏览器中单击“重新加载”时HTTP请求/响应标题的副本。在此跟踪中,自上次获取后,服务器内容尚未重新编译(但请注意,nocache.js的缓存版本仍然错误!):

  • 浏览器上的app.nocache.js已从web服务器重新加载(200确定),因为服务器上的文件比浏览器缓存更新。我验证了服务器返回的新文件的文件大小和时间戳是否正确。(这是关于服务器HTTP响应的信息报告)
我不相信这个。我在Chrome的开发工具中看到了一些奇怪的行为,比如网络标签和缓存(至少对我来说不是100%透明的)。如有疑问,我通常仍会咨询Firebug


所以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