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 :))
Пример:
Итак, я предполагаю, что я делаю что-то не так, так как правильно настроить cors origin (или что-то еще)?




Это нормально, и это не ваш код, это браузер.
Первый запрос PREFLIGHT отправляется как ОПЦИИ, чтобы проверить только заголовки и избежать побочных эффектов отправки первого запроса как GET или POST.
CORS в основном реализован для обеспечения безопасности браузеров с помощью заголовков ответов. Предположим, вы отправляете данные на какой-то междоменный сервер, и на сервере нет соответствующих заголовков, но, поскольку ваш запрос является GET или POST действительным запросом, сервер будет обрабатывать запрос в обычном режиме, в то время как браузер покажет ошибку CORS из-за отсутствия заголовков .
В качестве меры предосторожности в этой ситуации предварительный запрос выполняется в качестве ОПЦИЙ, чтобы проверить отправленные сервером заголовки ответа перед выполнением исходного запроса. Если сервер не отправил правильные заголовки, браузер не будет выполнять исходный запрос.
Запросы @ user2870934 OPTIONS ограничены запросами Ajax с типом содержимого, отличным от plaintext. Stackoverflow использует отправку форм, поэтому там нет OPTIONS. Если вы сделаете запрос ajax с типом содержимого как application / json, он сначала сделает запрос OPTIONS.
Вы не делаете ничего плохого. Первый запрос OPTION - это Предполетный запрос, автоматически выданный браузером. Он проверяет, действительно ли сервер разрешает запрос от источника, метода и т. д. Вы можете установить максимальный возраст, CorsConfiguration.setMaxAge, который сообщает браузеру, что нужно кэшировать ответ Preflight на определенный период.
Если это нормально, почему я не вижу такого поведения ни на одном веб-сайте? Например stackoverflow? или любой другой? Честно говоря, я не нашел ни одного веб-сайта с таким поведением. p.s. извините за копипаст.
и да, максимальный возраст немного помогает, но если я отправлю на сервер новый путь (или параметры), перед этим запросом «браузер» сделает запрос параметров, поэтому, если это разбивка на страницы (новая страница с новыми параметрами), это будет вести себя так же, как и без максимального возраста
Вы не увидите этого, если исходный адрес и URL-адрес запроса совпадают. Обратите внимание на URL-адреса запросов в случае StackOverflow. Да, максимальный возраст мало помогает. См. Первый ответ здесь, stackoverflow.com/questions/12013216/…
Первый запрос типа OPTIONS, это нормально. Метод HTTP OPTIONS используется для описания параметров связи для целевого ресурса.
Подробнее об этом здесь: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
Если это нормально, почему я не вижу такого поведения ни на одном веб-сайте? Например stackoverflow? или любой другой? Честно говоря, я не нашел ни одного веб-сайта с таким поведением. p.s. извините за копировальную пасту
Не думаю, что вы делаете что-то не так, это нормально. Если вы отправляете какие-либо пользовательские заголовки помимо заголовков, которые отправляются автоматически, браузер сначала делает запрос 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.
Если это нормально, почему я не вижу такого поведения ни на одном веб-сайте? Например stackoverflow? или любой другой? Честно говоря, я не нашел ни одного веб-сайта с таким поведением. p.s. извините за копировальную пасту