I'm using Spring MVC with Spring Security and JQuery. I have lots of places where I'm populating a div using JQuery's post() or load() methods. However, if my session had expired, the destination div element would get populated with my login page. To get around this, I learned about JQuery's global AJAX event handlers (http://api.jquery.com/category/ajax/global-ajax-event-handlers/).
What wasn't totally obvious to me when I first looked at it was that you can attach your event handler function to any old element. In my case I just picked the <head> element since I know there's only one of them. That handler will still be called for all AJAX calls, no matter what element they were called from.
Here is my setup code - I placed it within the of my header JSP. You can see examples of how I used the same technique for globally handling errors, and showing a "waiting" icon while a request is processing.
<script language="JavaScript">
//global ajax event handlers
$('html').ajaxSuccess(
function(event, xhr, ajaxOptions) {
//if the response contains the string '***LOGIN***' (which appears as a
//comment in login.jsp), log the user out
if(xhr.responseText.indexOf('***LOGIN***') >= 0) {
window.location.href = '<c:url value="/j_spring_security_logout"/>';
}
}
);
$('html').ajaxStart(
function() {
$('#waitingIcon').show();
}
);
$('html').ajaxStop(
function() {
$('#waitingIcon').hide();
}
);
$('html').ajaxError(
function() {
$('#globalErrorDiv').html('<div class="validationError">We\'re sorry, an error \
occurred while processing. Please try again.</div>');
}
);
</script>
No comments:
Post a Comment