Загрузка Angular 6 + Spring: Ошибка: «из источника» http://localhost:4200' заблокировано политикой CORS » - PullRequest
1 голос
/ 12 июня 2019

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

Я использовал следующую строку кода в классе контроллера.

@ CrossOrigin (origins = "http://localhost:4200/", maxAge = 3600)

Я также включил этот файл SimpleCORSFilter.java в папку java:

package com.oms;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class SimpleCORSFilter implements Filter {

private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class);

public SimpleCORSFilter() {
    log.info("SimpleCORSFilter init");
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");

    chain.doFilter(req, res);
}

@Override
public void init(FilterConfig filterConfig) {
}

@Override
public void destroy() {
}

}

Также я создал файл proxy.conf.json в угловом проекте:

{
    "/api": {
      "target": "http://localhost:8080",
      "secure": false
    }
  }

Этот файл включен в angular.json следующим образом:

"start": "ng serve --proxy-config proxy.conf.json",

Тем не менее я получаю эту ошибку:

Доступ к XMLHttpRequest по адресу http://localhost:8080/fetchAll' от происхождения 'http://localhost:4200' заблокирован политикой CORS: Запрос авторизация поля заголовка не разрешена Access-Control-Allow-Headers в предполетном ответе. **

Я ссылался на запросы такого типа, но не смог получить точное решение.

Я действительно запутался, есть ли какая-либо ошибка в коде? Какие шаги необходимо предпринять для решения этой проблемы?

Ответы [ 3 ]

1 голос
/ 12 июня 2019

Когда вы используете Spring Boot, я бы предложил вам добавить bean-компонент CorsFilter в ваши конфигурации вместо введения фильтра CORS.Позвольте мне знать, если это помогает.

@Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("OPTIONS");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("POST");
        config.addAllowedMethod("PUT");
        config.addAllowedMethod("DELETE");
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }

Happy Coding:)

1 голос
/ 12 июня 2019

Проблема с заказом фильтров с пружинной загрузкой. Добавьте эту аннотацию к вашему CORSFilter: @Order(Ordered.HIGHEST_PRECEDENCE).

Это гарантирует, что ваш CORSFilter имеет самый высокий приоритет выполнения (самый высокий).

1 голос
/ 12 июня 2019

Эта ошибка появляется, потому что запрос содержит некоторые дополнительные заголовки, которые не упомянуты в конфигурации фильтра CORS.

Для добавления поддержки CORS во время разработки я обычно предпочитаю добавлять нижеприведенный конфигурационный файл. Вам также необходимо иметь ключ app.cors.enabled со значением true в файле конфигурации приложения (application.properties), чтобы он работал.

import org.springframework.context.annotation.Bean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@ConditionalOnProperty(name = "app.cors.enabled")
/**
* If the value of the key "app.cors.enabled" is true in application.properties file,
* then only this configuration will be enabled.
* 
*/
public class SpringConfig {

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

Убедитесь, что для производственной среды вы удалите ключ app.cors.enabled из файла конфигурации или установите для него значение false. Если вам также требуется поддержка CORS в производственной среде, убедитесь, что вы используете фиксированные значения, а не разрешаете все значения, используя *

Как только вы это сделаете, на контроллере не будет необходимости в аннотации @CrossOrigin.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...