Вход в ajax с помощью Spring WebMVC и Spring Security

Я использую Spring Security 3.0 для нашего механизма входа на сайт с использованием специальной веб-страницы входа. Теперь мне нужно, чтобы эта веб-страница входа в систему была лайтбоксом / всплывающим окном на каждой веб-странице нашего сайта, где после входа в систему я получаю результат AJAX независимо от того, был он успешным или нет. Как лучше всего это сделать с помощью Spring Security и Spring webmvc 3.0?

16
задан skaffman 10 August 2010 в 07:14
поделиться

1 ответ

На стороне клиента вы можете имитировать отправку обычной формы на ваш 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);
    }
}
}
13
ответ дан 30 November 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: