Давайте посмотрим на класс Spring, который выполняет проверку подлинности, которая /org/springframework/security/web/authentication/UsernamePasswordAuthenticationFilter.java
private boolean postOnly = true;
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
if (postOnly && !request.getMethod().equals("POST")) {
throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
}
Вы отправляете запрос GET с/jspring_security_check? J_username = X & j_password = Z, когда он ожидает запрос POST.
Запрос должен быть POST-запросом с приложением Content-Type 'application/x-www-form-urlencoded' и двумя параметрами. Тело запроса не должно быть объектом JSON.
Предлагаю пересмотреть ваш логин и не использовать Ajax.
j_spring_security_check не предназначен для вызова через Ajax со страницы входа. Он предназначен для приема запроса POST из HTML-формы, а затем для отображения главной страницы приложения в ответе HTTP для отправки формы входа в систему.
Что делает j_spring_security_check, так это то, что он аутентифицирует пользователя, и если аутентификация прошла успешно, он создает сеанс и перенаправляет пользователя на главный экран, иначе он перенаправляет пользователя на экран «с ошибкой входа». j_spring_security_check возвращает 302 HTTP-код, который перенаправляется.
Вход в систему RESTful возможен, но вам нужно настроить j_spring_security_check для ответа не на успешное (или неудачное) окно входа в систему, а с помощью JSON, поэтому вам придется писать пользовательские обработчики входа на стороне Java. Я сделал это один раз, и это сделало код (как Java, так и ExtJS) настолько сложным, что я вернулся к регистрации на основе форм. В конце концов, Facebook и Google используют форму для входа в систему, и это довольно нормально. В моем случае переход на логин AJAX REST не стоил усилий.
Еще одно преимущество подачи формы заключается в том, что веб-браузер может запоминать логин и пароль, что невозможно с помощью входа в систему на основе Ajax, и я думаю, что именно поэтому Google и Facebook используют форму представления.
Но если вы решили, что вам по-прежнему нужен вход на основе Ajax (который я решительно отвергаю из-за сложности реализации и потому, что пользовательский интерфейс не повредит менеджер паролей браузера, который не работает), вам придется создать два Spring MVC-контроллера , один для успешного входа в систему (loginSucessController), другой для входа в систему (loginFailureController), оба контроллера должны возвращать единообразный ответ JSON с статусом входа. Затем настроить Spring Security для использования двух контроллеров выше
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:sec="http://www.springframework.org/schema/security"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<sec:http>
<sec:intercept-url pattern="/**"/>
<sec:http-basic/>
<sec:form-login default-target-url="/loginSucessController" authentication-failure-url="/loginFailureController"/>
<sec:logout/>
</sec:http>
</beans>
Конечно, вам придется создавать отображения и реализацию для loginSucessController и loginFailureController, я пропустил эту часть.
loginSucessController должен вернуть
{ "loginStatus": 1 }
и loginFailureController должен возвращать
{ "loginStatus": 0 }
Вы также должны создать третий контроллер MVC, чтобы обнаружить, если пользователь уже подписан в решить, если форму входа должен отображаться, когда пользователь возвращается на веб-страницу приложения, используйте org.springframework.security.core.context.SecurityContextHolder # getContext
проблема, которую я использую при использовании JSP, - это мои ходовые представления, все используют HTML-шаблоны для создания html-представлений. Поэтому, чтобы использовать JSP-страницу, мне пришлось бы строить эту одну страницу без основы. Я бы предпочел просто создать все приложение, используя базовую структуру. – nmb1106
Каков наилучший способ использования формы входа в JSP, когда я использую магистраль? Можно ли встроить jsp в представление о магистрали? – nmb1106
Когда я разрабатывал приложение с ExtJS, я создал отдельную статическую HTML-страницу для входа в систему, которая вообще не использовала javascript. Пользователь был перенаправлен в файл приложения ExtJS application html при успешном входе в систему, это самый простой подход. –