I faced this problem, Requirement need to display a confirmation popup when user do any action after session gets timed out, my proposed solution was:
<security:http use-expressions="true" auto-config="true" entry-point-ref="authenticationEntryPoint"> <security:intercept-url pattern="/common/auth/**" access="permitAll" /> <security:intercept-url pattern="/javax.faces.resource/**" access="permitAll" /> <security:intercept-url pattern="/**/ *.*" access="hasRole('ROLE_ADMIN')" /> <security:form-login login-page="/common/auth/login.jsf" /> <!-- <security:remember-me key="secret" services-ref="rememberMeServices" /> --> <security:logout invalidate-session="true" logout-success-url="/common/auth/login.jsf" /> </security:http> <bean id="authenticationEntryPoint" class="com.x.y.MyRedirectEntryPoint" > <property name="loginFormUrl" value="/common/auth/login.jsf"/> </bean>
The MyRedirectEntryPoint should extends AuthenticationProcessingFilterEntryPoint and override commence method
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { boolean ajaxRedirect = request.getHeader("faces-request") != null && request.getHeader("faces-request").toLowerCase().indexOf("ajax") > -1; if (ajaxRedirect) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication == null) { response.sendError(403); } } else { super.commence(request, response, authException); } }
Now you can simply bind a callback javascript function to catch the thrown 403 error and do what ever you want:
$(document).bind('ajaxError', function(event, request, settings, exception){ if (request.status==403){ //do whatever you wanted may be show a popup or just redirect window.location = '#{request.contextPath}/'; } });