Вы можете увидеть следующее сообщение об ошибке:
блокировано политикой CORS: в запрошенном ресурсе отсутствует заголовок Access-Control-Allow-Origin
Эта ошибка указывает на то, что запрос на определенный адрес был заблокирован протоколом CORS, поскольку в ресурсе отсутствует заголовок Access-Control-Allow-Origin.
Основная причина проблем с перекрестным происхождением заключается в том, что браузеры по соображениям безопасности ограничивают доступ к ресурсам за пределами текущего сайта.
Например, рассмотрим веб-сайт, размещенный по адресу http://127.0.0.1:8080/, с определенной страницей. Если вы получаете доступ к ресурсам с одного и того же сайта, ограничений нет. Но если вы попытаетесь получить доступ к ресурсам с другого сайта (например, http://127.0.0.1:8081), браузер заблокирует запрос.
Примечание. Мы рассматриваем протокол, домен и порт как часть определения «того же происхождения».
Это ограничение не распространяется на элементы с атрибутом src, такие как теги img и script.
Исторически, когда интерфейс и сервер не были разделены, страницы и интерфейсы запросов существовали в одном домене и порту. Тогда браузеры разрешат запросам со страницы, размещенной в одном домене, запрашивать ресурсы из того же домена.
Например, http://127.0.0.1:8080/index.html может свободно запрашивать http://127.0.0.1:8080/a/b/c/userLit.
В настоящее время, когда интерфейсная и серверная части разделены на разные приложения, это запрещено и приведет к проблемам CORS.
Происхождение (или источник) состоит из протокола, домена и номера порта.
URL-адрес состоит из протокола, домена, порта и пути. Два URL-адреса считаются «одинаковыми», если их протокол, домен и порт идентичны. Любая разница в любом из этих трех элементов представляет собой запрос между источниками.
Рассмотрите возможность сравнения источников происхождения для https://www.baidu.com/index.html:
URL | Перекрестное происхождение | Причина |
---|---|---|
https://www.baidu.com/more/index.html | Нет | Тот же протокол, домен и порт |
https://map.baidu.com/ | Да | Другой домен |
http://www.baidu.com/index.html | Да | Другой протокол |
https://www.baidu.com:81/index.html | Да | Другой порт |
Политика одинакового происхождения — это фундаментальная функция безопасности браузера. Без этого нормальная функциональность браузеров может оказаться под угрозой. Веб-архитектура во многом зависит от этой политики, и браузеры реализуют ее для обеспечения безопасности.
Политика одинакового происхождения включает в себя:
В проекте, где интерфейсная и серверная части развертываются отдельно, использование CORS имеет решающее значение. Файлы cookie используются для хранения информации для входа в систему пользователя, а перехватчики Spring управляют разрешениями. Проблемы возникают, когда перехватчик и CORS обрабатываются в неправильном порядке, что приводит к ошибке CORS.
HTTP-запрос сначала проходит через фильтр, прежде чем достичь сервлета, а затем перехватчика. Чтобы гарантировать, что обработка CORS происходит до перехвата авторизации, мы можем поместить конфигурацию CORS в фильтр.
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.setAllowCredentials(true); UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); } }
Хотя JSONP может решать проблемы перекрестного происхождения во внешнем интерфейсе, он поддерживает только запросы GET, что является ограничением в приложениях RESTful. Вместо этого вы можете обрабатывать запросы из разных источников с помощью совместного использования ресурсов из разных источников (CORS) на внутренней стороне. Это решение не уникально для Spring Boot и использовалось в традиционных средах SSM. Вы настраиваете его, реализуя интерфейс WebMvcConfigurer и переопределяя метод addCorsMappings.
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600); } }
Вы можете включить CORS для определенных методов контроллера, добавив аннотацию @CrossOrigin к аннотации @RequestMapping. По умолчанию @CrossOrigin разрешает все источники и методы HTTP, указанные в @RequestMapping.
@RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... } }
Понимание параметров @CrossOrigin:
Пример:
@CrossOrigin @RestController public class PersonController { @RequestMapping(method = RequestMethod.GET) public String add() { // some code } }
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3