tags:

views:

42

answers:

2

Hi,

I've made a twitter-like web app. Users can follow one another when viewing eachother's pages. Here's a high-level description of what's happening:

  • UserA views their own page at www.mysite.com/UserA, which renders a list of users they're following.
  • UserA navigates to UserB's page at www.mysite.com/UserB.
  • UserA follows UserB (via ajax).
  • UserA hits the back button on the browser, to go see their own page again at www.mysite.com/UserA.
  • It looks like a cached version of the page is shown, because the list of UserA's followings is not being shown.
  • If I hit the refresh button, the listing will now be current.

So is there a way to expire the page in the browser, so that it pulls a fresh copy when hitting the back button? Ideally I could do this only if the user had followed another user, otherwise a cached version of the page would be perfect.

I hope the problem is explained clearly enough, please let me know if I can supply more information. I am using a java/servlets based server (google app engine).

Thank you

+2  A: 

You need to instruct the webbrowser to not cache the pages in the history so that it's forced to fire a brand new request to the server when you navigate back in the history. In JSP/Servlet this can be done by adding the following headers to the response of the page(s) you'd like to disable the cache for:

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
response.setDateHeader("Expires", 0); // Proxies.

This can be done in a Servlet which forwards to the JSP or a Filter which intercepts on JSP requests.

See also:

BalusC
This can work, but is there a way to selectively use it? I mean only force the full refresh if the user in fact did follow the other user? Otherwise it's not needed and is a nice savings for me and the user. Thanks
No, that's technically not possible without re-requesting the page from the server so that it returns the updated headers. And that's in turn not possible when the page is cached. So all with all it makes technically no sense.
BalusC
+1  A: 

BalusC's answer sounds good, but what about a script in the page that does something like this? (JQuery assumed)

<script>
function updateFromServer()
{
    // ajax get update from server GO!
}

$(document).ready( function() {
    // on page load, get an update from the server
    updateFromServer() ;
}) ;

// also check for update from server every 2 sec
window.setInterval( 'updateFromServer();', 2000 ) ;
</script>
bobobobo
This could work too, ideally I could set some flag on the browser to force expiry in its cache if the user followed the other user on that page view. Is something like that possible? Like browser.expire("www.mysite.com/UserA"); This way, in case the user hits the back button to their own page, it'll be fully reloaded. If the user did *not* follow, then allow the page to be redisplayed from the cache. This would be perfect and be nice for me and the user. Thanks