Spring boot security не перенаправляет после истечения сеанса - PullRequest
0 голосов
/ 15 мая 2019

Я использовал пружинную загрузку, с защитой пружины и 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.

enter image description here

1 Ответ

1 голос
/ 15 мая 2019

Краткий и простой ответ:

Поскольку вы отправляете свой запрос AJAX, Ответ не «влияет» на текущую загруженную страницу.

Чтобы быть более точным:

Большинство обозревателей (все, что я знаю) перенаправляют (уважают заголовок местоположения), только если в заголовке ответа найден код перенаправления HTTP (301, 302, 303). Технически, если бы spring отправила http-код состояния 302 вместе с URL-адресом для аутентификации, браузер изменил бы местоположение.

Насколько я знаю, Spring отправляет 302 IF , это GET-запрос

Простое решение:

Это один из способов пойти по Javascript и JQuery: Проверьте результат вашего ответа ajax. (Это просто пример, чтобы дать вам направление, будет больше решений.

    $.ajax({
        type: 'POST',
        url: '/url',
        success: function (result, status) {
            if (result.status === 401) {
                 location.href='/login?logout';
            }
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...