Я использую Spring Security 3.0 для нашего механизма входа на сайт с использованием специальной веб-страницы входа. Теперь мне нужно, чтобы эта веб-страница входа в систему была лайтбоксом / всплывающим окном на каждой веб-странице нашего сайта, где после входа в систему я получаю результат AJAX независимо от того, был он успешным или нет. Как лучше всего это сделать с помощью Spring Security и Spring webmvc 3.0?
На стороне клиента вы можете имитировать отправку обычной формы на ваш URL-адрес для входа через ajax. Например, в jQuery:
$.ajax({
url: "${pageContext.request.contextPath}/j_spring_security_check",
type: "POST",
data: $("#loginFormName").serialize(),
beforeSend: function (xhr) {
xhr.setRequestHeader("X-Ajax-call", "true");
},
success: function(result) {
if (result == "ok") {
...
} else if (result == "error") {
...
}
}
});
На стороне сервера вы можете настроить AuthenticationSuccessHandler
и AuthenticationFailureHandler
для возврата значения вместо перенаправления. Поскольку вам, вероятно, также понадобится обычная страница входа (для попытки доступа к защищенной странице через прямой URL-адрес), вы должны отличать вызовы ajax от обычных вызовов, например, используя заголовок:
public class AjaxAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
private AuthenticationSuccessHandler defaultHandler;
public AjaxAuthenticationSuccessHandler() {
}
public AjaxAuthenticationSuccessHandler(AuthenticationSuccessHandler defaultHandler) {
this.defaultHandler = defaultHandler;
}
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication auth)
throws IOException, ServletException {
if ("true".equals(request.getHeader("X-Ajax-call"))) {
response.getWriter().print("ok");
response.getWriter().flush();
} else {
defaultHandler.onAuthenticationSuccess(request, response, auth);
}
}
}