CORS (проблема перекрестного происхождения) при вызове сервисов Spring Rest из Angular4 - PullRequest
0 голосов
/ 24 января 2019

У нас есть приложение внешнего интерфейса, разработанное в Angular2, и службы (службы REST), разработанные с использованием Spring MVC. Когда приложение внешнего интерфейса, то есть javascript, вызывает службу, мы сталкиваемся с проблемой перекрестного источника, и вызовы службы не успешны.

В исследованиях есть возможность включить CORSFilter на стороне службы, но пользовательский интерфейс вызывает около 30 служб, и все они являются отдельными развертываемыми.

Внесение изменений в 30 услуг не является жизнеспособным вариантом, кроме внесения изменений на стороне служб, есть ли другие доступные варианты?

Пожалуйста, предложите.

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Существует решение для весенней загрузки, вы можете найти его по этой ссылке: https://spring.io/guides/gs/rest-service-cors/ Я не совсем уверен, что вам нужно, но @crossOrigin (-> Ссылка вашего сайта <-) работала надмой конец</p>


РЕДАКТИРОВАТЬ

Вот глобальная конфигурация в этой ссылке: https://spring.io/guides/gs/rest-service-cors/#_global_cors_configuration после добавления этого в мое приложение это решило мою проблему.

0 голосов
/ 24 января 2019

Я думаю, здесь есть нечто большее, чем кажется на первый взгляд, и важно сначала понять CORS, а затем попытаться найти решения, когда люди приводят такие слова, как - Angular и т. Д. В обсуждении CORS.

Допустим, вы разработали и развернули API-интерфейсы с намерением использовать их из определенного кода пользовательского интерфейса, развернутого по адресу с определенным фиксированным URL / доменом . Как сервер, CORS - это способ сообщить клиентам (например, браузерам), что, хотя я и обслуживаю этот запрос, но я также говорю вам, что этот запрос пришел не из домена пользовательского интерфейса, который я, как сервер ожидал ( от по умолчанию - это должно быть того же происхождения ), чтобы вы предприняли необходимые действия. Когда браузер помечается сервером, он подавляет ответ сервера и показывает, что запрос не выполнен.

Выше приведено очень упрощенное описание, и вам следует больше узнать о политике Same Origin Security .

Кроме того, обратите внимание, что сервер помечает клиента, устанавливая заголовки ответа о происхождении, которое он поддерживает, но в любом случае обслуживает ответ, поэтому до этого момента вы должны понимать два момента,

  1. Он не имеет ничего общего с Angular и имеет все, что связано с браузером
  2. Это прерогатива клиента, что делать, если сервер сообщает ему, что запрос не пришел из источника / домена, от которого он ожидал. Обычно это делают только веб-браузеры, а не такие клиенты, как curl etc

С учетом всего вышесказанного, хотели бы вы, чтобы ваши API размещались в том же домене, что и домен UI? Если нет, то вам нужно изменить код на стороне сервера, чтобы явно указывать заголовки CORS, иначе браузер буду продолжать терпеть неудачу.

Решения,

1.Добавить аннотацию - org.springframework.web.bind.annotation.CrossOrigin к каждой из конечных точек.

2.Добавьте глобальную конфигурацию для каждого развертываемого модуля, как показано здесь . Преимущество заключается в том, что эти артефакты могут быть дополнительно развернуты в разных доменах.

Не просто копировать вслепую - вставьте эту строку, config.addAllowedOrigin("*");, установите для нее определенный домен, который вы хотите обслуживать, иначе нет смысла в такой безопасности.

3. Напишите еще один развертываемый артефакт, передающий ваши средства безопасности, такие как CORS и т. Д., И этот артефакт будет фронт для получения всех входящих запросов и последующего ответа после построения ответов из этих 30 конечных точек. Клиенты не будут напрямую взаимодействовать с этими 30 конечными точками, а только с этим артефактом. Очевидно, этот артефакт также будет необходим в той же области, что и эти 30 конечных точек.

Внесение изменений в 30 услуг не является жизнеспособным вариантом, кроме внесение изменений в сторону услуг, есть ли другие варианты доступны

Я не думаю, что есть какое-либо иное решение, кроме внесения изменений в код на стороне сервера. Никто за пределами вашей команды не может навязать это вам, потому что модель развертывания очень уместна и зависит от потребности по мере необходимости от организации к организации.

Источник * Заголовок отправляется в запросе и состоит из трех частей: протокола, хоста и номера порта.

0 голосов
/ 24 января 2019

Я думаю, что нет другого способа, кроме как включить CORS на вашей стороне сервера.Возможно, вы могли бы инкапсулировать свои конечные точки API, создав специализированный микросервис, и включить на нем CORS .

...