ОК - есть базовое решение, я не говорю, что оно лучшее, но похоже, что оно выполнит свою работу.
Это основано на сообщении в блоге Санджива Дживана
http://www.jroller.com/sjivan/entry/ajax_based_login_using_aceci
РЕДАКТИРОВАТЬ: Просто прочитав комментарии к этому сообщению, похоже, что может быть другой способ сделать это, также посту более 3 лет, поэтому не удивлюсь, если есть лучшие решения там, возможно, используя новые функции в Spring или J2EE. Но сейчас я буду придерживаться этого.
Он проделал очень хорошую работу, документировав это там, поэтому я просто прокомментирую здесь, что у меня есть базовый пример, начиная с копирования примера приложения Spring Security., Затем добавляя ServletFilter, как описано Sanjiv.
Поскольку он использовал более раннюю версию Acegi Security (теперь она называется Spring Security), потребовалось одно или два изменения:
Шаблон URL теперь "/j_spring_security_check
" (не "/j_acegi_security_check
"), и я обнаружил, что мне нужно добавить вход с именем "ajax", чтобы метод isAjaxRequest вернул true - догадываясь, что что-то пропустил в javascript для этого.
Пришлось изменить одну строку в фильтре, чтобы проверить «login_error» вместо «login_error = 1», предполагая, что это изменилось в более новых версиях SpringSecurity. I.E.:
if (redirectURL.indexOf("login_error") == -1) {
Также, поскольку я использую jquery, а не прототип, я создал базовую html-страницу с javascript для тестирования с использованием jquery.
Это грубое и готовое на данный момент, отображаемое состояние - просто "url: / msgbrd /" или "error: Bad credentials", но может привести его в порядок достаточно просто.
Если это поможет, вот мой пример index.html:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript" src="jquery-1.3.2.js"></script>
<script type="text/javascript" src="jquery.form.js"></script>
<script type="text/javascript">
var loginOptions = {
beforeSubmit: postingLogin, // pre-submit callback
success: showResponse, // post-submit callback
type: 'post',
url: '/msgbrd/j_spring_security_check' ,
clearForm: true
};
$(document).ready(function(){
$('#loginForm').ajaxForm( loginOptions );
});
function postingLogin() {
console.log("Login posting: ");
}
function doneLogin() {
console.log("Login posted ");
}
function showResponse(responseText, statusText) {
$("#statusMessage").empty();
$("#statusMessage").append( responseText);
}
</script>
</head>
<body>
<h1>msgbrd</h1>
<div>
<form id="loginForm" action="" method="POST">
<p><label for="username"> User Name: </label> <input id="username"
type="text" name="j_username" class="loginText"></p>
<p><input id="ajax" name="ajax" value="ajax"></input></p>
<p><label for="password"> Password: </label> <input id="password"
type="password" name="j_password" class="loginText"
onkeydown="loginOnEnter(event);"></p>
<p><label for="remember_me"> <input id="remember_me"
type="checkbox" name="_acegi_security_remember_me">Remember Me</label>
</p>
<p><input type="submit" value="Go"></input></p>
<p id="statusMessage"></p>
</form>
</div>
</body>
</html>