Метод запроса «POST» не поддерживается после добавления аннотаций безопасности

У меня есть 2 контроллера:

a)

@Override
@RequestMapping(value = "/portal/form.html", method = RequestMethod.GET)
@Transactional
public String form(final Message message, final Model model) {
    return "portal/form";
}

b)

@Override
@RequestMapping(value = "/portal/form.html", method = RequestMethod.POST)
@Transactional
@PreAuthorize("#message.id!=null ? hasPermission(#message, 'WRITE') : hasRole('ROLE_ADMIN')") 
public String form(@Valid final Message message, final Model model) {
    if (message.getId() == null) {
        someService.save(message);
        AclManager.create(message);
    } else {
        someService.update(message);
        AclManager.update(message);
    }
    return "redirect:result.html";
}

До того, как я поставил аннотации безопасности в Controller "b", все было хорошо. Теперь, когда я перехожу на страницу контроллера «а» и заполняю форму, нажимаю кнопку, которая вызывает контроллер «б», и я получаю «Статус HTTP 405 — метод запроса« POST »не поддерживается». Почему это происходит и как это исправить?

UPD: помог добавить в логин-контроллер RequestMethod.POST


person Amfion    schedule 04.07.2013    source источник


Ответы (2)


Трудно отлаживать без вашей конфигурации безопасности spring, но я предполагаю, что когда вы переходите к /portal/form.html, Spring перенаправляет вас на страницу входа с использованием HTTP POST, в то время как обработчик контроллера вашей страницы входа отображается только на HTTP GET. Попробуйте сопоставить обработчик страницы входа с методом POST.

person gerrytan    schedule 05.07.2013

Я также столкнулся с описанными вами симптомами при переносе использования Spring Security 3.2.0.RELEASE в моем приложении с конфигурации на основе XML на конфигурацию на основе JavaConfig.

В моем конкретном случае причиной появления сообщения HTTP Status 405 - Request method 'POST' not supported была активация защиты CSRF по умолчанию Spring Security при использовании конфигурации на основе JavaConfig.

Чтобы устранить эту причину, можно:

  • либо обновите приложение, чтобы оно соответствовало механизму защиты CSRF от Spring Security.
  • или деактивировать механизм защиты CSRF от Spring Security.

Чтобы деактивировать механизм защиты CSRF, в WebSecurityConfigurer сделайте что-то вроде следующего:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .disable() //FIXME
            .authorizeRequests() ....
    }

    // ...
}
person Abdull    schedule 21.02.2014
comment
Большое спасибо. Я ломал голову над одним и тем же вопросом в течение последнего дня. - person sandeepsharat; 04.03.2016