HttpRequestMethodNotSupportedException при попытке передать данные с помощью AJAX

Доброго времени суток, столкнулся с проблемой, которая бросает 405 ошибку. Это происходит при использовании любого метода, вот следующие фрагменты кода (в данном случае метод POST):

@Controller
@RequestMapping("/tickets")
public class SellTicketController {
    @PostMapping(value = "/buy")
    public String buyTickets(@RequestBody BuyTicketsDto buyTickets) {

        // code

        return "redirect:/home";
    }
}

А вот код AJAX:

$.ajax({
    type : "POST",
    contentType : "application/json",
    url : "/tickets/buy",
    data : {
        sessionId : id,
        login : login,
        price : price,
        seats : seats
    },
    dataType : 'json',
    success : function(result) {

    },
    error : function(e) {

    }
});

В данном случае получаю следующую ошибку:

DEBUG 32 --- [nio-8000-exec-7] o.s.web.servlet.DispatcherServlet        : "FORWARD" dispatch for POST "/redirect", parameters={}
WARN 32 --- [nio-8000-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]
DEBUG 32 --- [nio-8000-exec-7] o.s.web.servlet.DispatcherServlet        : Exiting from "FORWARD" dispatch, status 405
DEBUG 32 --- [nio-8000-exec-7] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for POST "/error", parameters={}
DEBUG 32 --- [nio-8000-exec-7] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
DEBUG 32 --- [nio-8000-exec-7] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Using 'application/json', given [application/json, text/javascript, */*;q=0.01] and supported [application/json, application/*+json, application/json, application/*+json]
DEBUG 32 --- [nio-8000-exec-7] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Writing [{timestamp=Sun Jul 26 21:47:08 EEST 2020, status=405, error=Method Not Allowed, message=Request meth (truncated)...]
DEBUG 32 --- [nio-8000-exec-7] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 405

BuyTicketsDto:

@Getter
@Setter
@Builder
@AllArgsConstructor
public class BuyTicketsDto {

    @NotEmpty
    private Long sessionId;

    private String login;

    @NotEmpty
    private Integer price;

    @NotEmpty
    private JSONArray seats;
}

Конфигурационный файл:

@Configuration
public class AppConfig implements WebMvcConfigurer {

    @Bean
    public Java8TimeDialect java8TimeDialect() {
        return new Java8TimeDialect();
    }

    @Bean
    public LocaleResolver localeResolver() {
        CookieLocaleResolver clr = new CookieLocaleResolver();
        clr.setDefaultLocale(Locale.ENGLISH);
        clr.setCookieName("language");

        return clr;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleChangeInterceptor());
    }
}

А также pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
    </parent>

    <groupId>com.cinema.whiteblack</groupId>
    <artifactId>whiteblack</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20200518</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

После обработки кода в любом случае должен быть редирект. Спасибо


Ответы (1 шт):

Автор решения: Alexandr

В подобных ситуациях в первую очередь смотрите DEBUG логи (org.springframework.web, org.springframework.security). POST запросы не будут разрешены, если включен CSRF и не передается CSRF токен с запросом. Вам необходимо либо выключить CSRF, либо начать передавать CSRF токен.

Обсуждения на данную тему:

→ Ссылка