views:

25

answers:

2

I've got an Ajax app I would like to add sessions and logins to.

Currently the app uses jQuery get shorthand to send a request

that.ajaxRequest = $.get(query_string, function(data, textStatus, xhr) { 

  // do somthing with data

});

I have a system on the server that throws an error message if the session has expired.

On the client I know I can deal with this using the following:

that.ajaxRequest = $.get(query_string, function(data, textStatus, xhr) { 

  if (data == "E_TIMEOUT") {

       // redirect to login

  } else {

       // do something

  }

});

However I would prefer not to have to write the same timeout code for every $.get - there are a bunch of them throughout the app.

Is there a way to monitor the result of a request and take action if necessary, without rewriting all of my $.get statements?

Thanks,

+1  A: 

You can use $.ajaxSetup() for this:

$.ajaxSetup({
  complete: function (xhr) {
    if (xhr.getResponseHeader('E_TIMEOUT') == "1") {
      //redirect to login
    }
  }
});

This approach is slightly different, it uses response headers which you can get without parsing data an extra time every request (that is possible, though not documented and subject to break), which you would have to do otherwise, in a global situation.

On the server-side where you're sending E_TIMEOUT for the response, just change it to add a header as well, E_TIMEOUT=1 (or whatever header you want). I actually put this header on my login page only, the timeouts redirect via a 302 (which XmlHttpRequest transparently follows), so if the user timeouts and the AJAX request actually ended up at the login page, I do a location.reload() to reflect this on the page. That's just another option if you go that route, it looks like this:

$.ajaxSetup({
  complete: function (xhr) {
    if (xhr.getResponseHeader('LoginPage') == "1") {
      location.reload();
    }
  }
});

Without knowing what server platform you're using I can't say how to set headers, but it's pretty easy on every common platform.

Nick Craver
Very nice. Thank-you!
Travis
A: 

You should use firefox and download a program called 'FireBug'. This will show you all the requests being sent out, and the response that comes back from the AJAX call. It is action packed with goodness & web dev tools.

Tommy