Я использовал пружинный ботинок, с пружинной безопасностью и Ext Js в качестве внешнего интерфейса. Я добавил этот кусок кода в качестве конфигурации для весенней безопасности. Это означает, что по истечении сеанса пользователь будет перенаправлен на указанный URL-адрес, верно?
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and()
.authorizeRequests().antMatchers("/", "/login/**").permitAll().and()
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/userAuth")
.permitAll()
.and()
.logout()
.permitAll()
.and()
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/**").permitAll();
http.csrf().disable();
http.headers().frameOptions().disable();
http.sessionManagement().maximumSessions(1).expiredUrl("/login?logout");
}
Каждый раз, когда мой веб-интерфейс отправляет ajax-запрос в spring, и пользователь теряет сеанс, Spring, как и следовало ожидать, превращает запрос в запрос get для / login? Logout, но страница не перенаправляется. Все, что я вижу, - это страница входа в контент ответа на запрос, без какого-либо влияния на страницу, которую видит пользователь.
Почему это происходит? Я пропускаю какую-либо конфигурацию или реализацию здесь?
РЕДАКТИРОВАТЬ: Вот как выглядит мой Ext Js для запроса AJAX:
onAuthCheck: function (users) {
var result = Ext.Ajax.request({
url: '/Queue/requests/loginCheck',
method: 'POST',
async: false,
params: {
usersInfo: Ext.encode(users)
},
success: function (conn, response, options, eOpts) {
console.log(response)
console.log(conn.status);
if (conn.status === 401 || conn.status === 302) {
location.href='/login?logout'
}
},
failure: function (conn, response, options, eOpts) {
console.log(response)
console.log(conn.status)
if (conn.status === 401 || conn.status === 302) {
location.href='/login?logout'
}
}
})
return (Ext.JSON.decode(result.responseText, true).success);
},
EDIT2: Вот как выглядит мой запрос: у него есть запрос со статусом 302, и я все еще получаю статус 200 в ответе AJAX на код JS.
Всего 1 ответ
Поскольку вы отправляете свой запрос через AJAX, Ответ не «влияет» на вашу текущую загруженную страницу.
Большинство браузеров (все, что я знаю) только перенаправляют (соблюдайте заголовок местоположения), если в заголовке ответа обнаружен HTTP-код перенаправления (301, 302, 303). Технически, если бы Spring отправлял HTTP-код состояния 302 вместе с URL-адресом для аутентификации, браузер изменил бы местоположение.
Насколько я знаю, Spring отправляет 302, если это GET-запрос
Это один из способов использования Javascript и JQuery: проверьте результат вашего ответа ajax. (Это просто пример, чтобы дать вам направление, будет больше решений.
$.ajax({
type: 'POST',
url: '/url',
success: function (result, status) {
if (result.status === 401) {
location.href='/login?logout'
}
}
});