Spring Boot HTTPS с CORS, Angular 5 удваивает все запросы

a есть Spring boot(v5) with embeded tomcat REST API для моего небольшого веб-сайта Angular 5, и этот REST API работает по протоколу https, поэтому мне нужно включить cors origin, чтобы мой веб-сайт мог взаимодействовать с REST API. Как мне это удалось:

@SpringBootApplication
public class AdminPanelApplication {
    public static void main(String[] args) {
        SpringApplication.run(AdminPanelApplication.class, args);
    }

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**")
                        .allowCredentials(true)
                        .allowedOrigins("*")
                        .allowedMethods("*")
                        .allowedHeaders("*");
            }
        };
    }
}

Но с этим cors origin мой веб-сайт начал отправлять 2 запроса на все запросы, первый - это запрос OPTION, второй - реальный (получить, отправить и т. д.).

Я предполагаю, что это плохо, по крайней мере, для нагрузки на сервер (вместо отправки одного запроса я всегда отправляю два (даже если сначала очень легкий запрос option), я не вижу такого поведения ни на одном веб-сайте (для пример stackoverflow :))

Пример:

Spring Boot HTTPS с CORS, Angular 5 удваивает все запросы

Spring Boot HTTPS с CORS, Angular 5 удваивает все запросы

Итак, я предполагаю, что я делаю что-то не так, так как правильно настроить cors origin (или что-то еще)?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 370
4

Ответы 4

Это нормально, и это не ваш код, это браузер.

Первый запрос PREFLIGHT отправляется как ОПЦИИ, чтобы проверить только заголовки и избежать побочных эффектов отправки первого запроса как GET или POST.

CORS в основном реализован для обеспечения безопасности браузеров с помощью заголовков ответов. Предположим, вы отправляете данные на какой-то междоменный сервер, и на сервере нет соответствующих заголовков, но, поскольку ваш запрос является GET или POST действительным запросом, сервер будет обрабатывать запрос в обычном режиме, в то время как браузер покажет ошибку CORS из-за отсутствия заголовков .

В качестве меры предосторожности в этой ситуации предварительный запрос выполняется в качестве ОПЦИЙ, чтобы проверить отправленные сервером заголовки ответа перед выполнением исходного запроса. Если сервер не отправил правильные заголовки, браузер не будет выполнять исходный запрос.

Если это нормально, почему я не вижу такого поведения ни на одном веб-сайте? Например stackoverflow? или любой другой? Честно говоря, я не нашел ни одного веб-сайта с таким поведением. p.s. извините за копировальную пасту

user2870934 25.04.2018 12:58

Запросы @ user2870934 OPTIONS ограничены запросами Ajax с типом содержимого, отличным от plaintext. Stackoverflow использует отправку форм, поэтому там нет OPTIONS. Если вы сделаете запрос ajax с типом содержимого как application / json, он сначала сделает запрос OPTIONS.

Atul Sharma 25.04.2018 13:29

Вы не делаете ничего плохого. Первый запрос OPTION - это Предполетный запрос, автоматически выданный браузером. Он проверяет, действительно ли сервер разрешает запрос от источника, метода и т. д. Вы можете установить максимальный возраст, CorsConfiguration.setMaxAge, который сообщает браузеру, что нужно кэшировать ответ Preflight на определенный период.

Если это нормально, почему я не вижу такого поведения ни на одном веб-сайте? Например stackoverflow? или любой другой? Честно говоря, я не нашел ни одного веб-сайта с таким поведением. p.s. извините за копипаст.

user2870934 25.04.2018 13:00

и да, максимальный возраст немного помогает, но если я отправлю на сервер новый путь (или параметры), перед этим запросом «браузер» сделает запрос параметров, поэтому, если это разбивка на страницы (новая страница с новыми параметрами), это будет вести себя так же, как и без максимального возраста

user2870934 25.04.2018 13:00

Вы не увидите этого, если исходный адрес и URL-адрес запроса совпадают. Обратите внимание на URL-адреса запросов в случае StackOverflow. Да, максимальный возраст мало помогает. См. Первый ответ здесь, stackoverflow.com/questions/12013216/…

Adisesha 25.04.2018 13:25

Первый запрос типа OPTIONS, это нормально. Метод HTTP OPTIONS используется для описания параметров связи для целевого ресурса.

Подробнее об этом здесь: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

Если это нормально, почему я не вижу такого поведения ни на одном веб-сайте? Например stackoverflow? или любой другой? Честно говоря, я не нашел ни одного веб-сайта с таким поведением. p.s. извините за копировальную пасту

user2870934 25.04.2018 12:58

Не думаю, что вы делаете что-то не так, это нормально. Если вы отправляете какие-либо пользовательские заголовки помимо заголовков, которые отправляются автоматически, браузер сначала делает запрос OPTION, чтобы быть безопаснее.

Preflighted requests first send an HTTP request by the OPTIONS method to the resource on the other domain, in order to determine whether the actual request is safe to send. Cross-site requests are preflighted like this since they may have implications to user data.

Обратитесь к здесь для получения подробной информации о CORS.

Другие вопросы по теме