How to make browser stop caching GWT nocache.js

We had a similar issue. We found out that timestamp of the nocache.js was not updated with gwt compile so had to touch the file on build. And then we also applied the fix from @Manolo Carrasco Moñino. I wrote a blog about this issue. http://programtalk.com/java/gwt-nocachejs-cached-by-browser/

We are using version 2.7 of GWT as the comment also points out.


There are two straightforward solutions (second is modified version of first one though)

1) Rename your *.html file which has a reference to *.nocache.js to i.e. MyProject.html to MyProject.jsp Now search the location of you *.nocache.js script in MyProject.html

<script language="javascript" src="MyProject/MyProject.nocache.js"></script>

add a dynamic variable as a parameter for the JS file, this will make sure actual contents are being returned from the server every time. Following is example

<script language="javascript" src="MyProject/MyProject.nocache.jsp?dummyParam=<%= "" + new java.util.Date().getTime() %>"></script>

Explanation: dummyParam will be of no use BUT will get us our intended results i.e. will return us 200 code instead of 304

Note: If you will use this technique then you will need to make sure that you are pointing to right jsp file for loading your application (Before this change you was loading your app using HTML file).

2) If you dont want to use JSP solution and want to stick with your html file then you will need java script to dynamically add the unique parameter value on the client side when loading the nocache file. I am assuming that should not be a big deal now for you given the solution above.

I have used first technique successfully, hope this will help.


The best way to avoid browser caching is set the expiration time to now and add the max-age=0 and the must-revalidate controls.

This is the configuration I use with apache-httpd

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>

your configuration for lighthttpd should be

server.modules = (
    "mod_expire",
    "mod_setenv",
)
...
$HTTP["url"] =~ "\.nocache\." {
  setenv.add-response-header = ( "Cache-Control" => "public, max-age=0, must-revalidate" )
  expire.url = ( "" => "access plus 0 days" )
}

$HTTP["url"] =~ "\.cache\." {
  expire.url = ( "" => "access plus 1 years" )
}