CORS заблокирован из-за отсутствия «Access-Control-Allow-Origin» в докеризированном приложении внешнего интерфейса Angular и докеризованном бэкэнде Spring Boot

Я создал приложение Angular и создал образ докера, который заставляет его запускаться на сервере Nginx (после запуска). Что касается бэкэнда, у меня также есть dockerized реализация. При попытке получить доступ к данным из бэкэнда я сталкиваюсь с ошибкой в ​​отношении политики CORS, так что в браузере я вижу следующее: «... был заблокирован политикой CORS: Нет» Access-Control-Allow -Origin «Заголовок присутствует ...»

Для решения проблемы я пробовал различные изменения конфигурации на сервере Nginx, например: (1) установка add_header «Access-Control-Allow-Origin» «http : //0.0.0.0: 8080 ", (2) попытка аналогичного изменения на стороне прокси, proxy_set_header" Access-Control-Allow-Origin "" http://0.0.0.0:8080 "и т. Д. Но ни один из они работали (обратите внимание, что "http://0.0.0.0:8080" относится к бэкэнду, тогда как к Angular, имеющему доступ через "http://0.0.0.0:7000").

Пример того, как моя конфигурация файл выглядит следующим образом:

server { 
    listen 80;
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
        try_files $uri $uri /index.html = 404;
    }

    location /api {
         proxy_pass http://0.0.0.0:8080;
         proxy_set_header "Access-Control-Allow-Origin" "http://0.0.0.0:8080"
     }
}

Не могли бы вы поделиться идеями о том, как решить эту проблему?

Спасибо!

2
задан 29 June 2020 в 20:57
2 ответа

Web bezeroa da (blokeatuta dagoen web bezeroa zure konfigurazioan kokatzen den leku guztietan) benetako blokeoa egiten duena, beraz, bezeroak nahi duen iturburuko helbidea baimendu behar duzu. erabili injektatutako Access-Control-Allow-Origin goiburuarekin.

Goiburu eta balio hori bezeroak jakin behar ditu eskaera bidali aurretik (huts egiten du zuretzat), beraz lehenago erantzun behar da

Estekan ikusten den moduan, goiburuko sintaxiak ez ditu ataka zenbakiak barne hartzen. Nik dakidala, 0.0.0.0 ez da sintaxia CORSek sareko zerbitzuen antzera interpretatzen du, baina ez dute hori probatu eta oker egon liteke.

Goiburuak ere ez du nik dakidanaren arabera protokoloa zehazten, baina soilik fqdn, adibidez www.example.com .

Ip helbide zehatz batek fqdn ordez funtziona dezakeela asmatuko nuke, baina ez dut probatu eta oker egon liteke.

Hala ere, komodin sintaxia erabili dut (*) estekan zehazten da eta honek funtzionatzen du. Ahal izanez gero, helbide zehatzagoa hobesten da, baina komodinarekin hasi eta goiburuaren injekzioa lehenik eta behin funtzionatzen duela ikusi daiteke.

Beraz, saiatu Access-Control-Allow-Origin: * nire iradokizuna.

0
ответ дан 4 January 2021 в 08:16

Ez da beharrezkoa nginx conf-en ezer gehitu beharrik proxy_set_header bezalakoa. CORS jatorria iragazkia gehitu behar duzu udaberriko web aplikazioan eta jatorri desberdinetatik onartzen duzu.

Honela:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
@Slf4j
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        final HttpServletResponse response = (HttpServletResponse) res;
        log.info("request came for url {}", ((HttpServletRequest) req).getRequestURL());
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
        response.setHeader("Access-Control-Max-Age", "3600");
        if (HttpMethod.OPTIONS.name().equalsIgnoreCase(((HttpServletRequest) req).getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
    }
}
0
ответ дан 4 January 2021 в 08:16

Теги

Похожие вопросы