Для аутентификации AJAX я добавил пользовательскую точку входа безопасности, чтобы проверить, аутентифицирован ли пользователь. Если они не, я посылаю им код ошибки 4xx. Затем при вызове Ajax я проверяю, возвращена ли ошибка, и если да, то перенаправляю их на свою страницу входа.
Вот фрагмент моей конфигурации безопасности.
<security:http entry-point-ref="myAuthenticationEntryPoint" auto-config="true" use-expressions="true">
...
...
</security:http>
<bean id="myAuthenticationEntryPoint" class="com.security.AjaxAuthenticationEntryPoint" >
<property name="loginFormUrl" value="/login"/>
</bean>
Вот моя точка входа:
public class AjaxAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint
{
@Override
/**
* This method only gets call when the user logs out or when the session is invalid
*
* It checks to see if the request is an ajax request
* if so then return an error
* else then do the natural check
*/
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException)
throws IOException, ServletException
{
if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With")))
{
if (request.getSession() != null)
{
Object targetUrl = request.getSession().getAttribute(WebAttributes.SAVED_REQUEST);
if (targetUrl != null)
{
response.sendError(HttpServletResponse.SC_EXPECTATION_FAILED);
}
}
}
else
{
super.commence(request, response, authException);
}
}
}
Вот фрагмент моего вызова JQuery, перезагрузка приводит к появлению страницы входа.
error: function (xhr, textStatus, errorThrown)
{
// 417 is sent from the server to indicate that
// page needs to be reloaded
//
if (xhr.status == 417)
{
xhr = null;
window.location.reload();
}
}