Angular 6 + Spring Boot:错误:“来自源'http:// localhost:4200'已被CORS策略阻止”

时间:2019-06-12 11:18:10

标签: java angular maven spring-boot cors

我正在尝试将Angle 6项目与Spring Boot应用程序连接。尽管我已经安装了所有依赖项和导入,但是当我运行角度项目时,它始终会出现此错误。

我在控制器类中使用了以下代码。

  

@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() {
}

}

我也已在angular项目中创建了proxy.conf.json文件:

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

此文件包含在angular.json中:

  

“开始”:“ ng serve --proxy-config proxy.conf.json”,

仍然出现此错误:

  

在以下位置访问XMLHttpRequest   原产地的“ http://localhost:8080/fetchAll”   “ http://localhost:4200”已被CORS政策阻止:请求   标头字段授权不被   飞行前响应中的Access-Control-Allow-Header。**

我引用了这类查询,但无法获得确切的解决方案。

我真的很困惑,如果代码中有任何错误?应该采取什么步骤解决此问题?

4 个答案:

答案 0 :(得分:1)

此错误即将到来,因为请求包含一些其他标头,而这些标头在您的CORS过滤器配置中未提及。

为了在开发过程中添加CORS支持,我通常更喜欢在spring配置文件下面添加。您还需要在应用程序配置文件(application.properties)中使用值为app.cors.enabled的{​​{1}}键,才能使其正常工作。

true

请确保在生产环境中,从配置文件中删除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。如果在生产环境中也需要CORS支持,请确保使用固定值,而不是使用false

允许所有值

一旦这样做,就无需在控制器上使用*注释。

答案 1 :(得分:1)

在使用Spring Boot时,建议您在配置中添加 CorsFilter bean,而不要引入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);
    }
  

快乐编码:)

答案 2 :(得分:1)

问题与带有弹簧罩的过滤器的订购有关。将此注释添加到您的CORSFilter@Order(Ordered.HIGHEST_PRECEDENCE)上。

这将确保您的CORSFilter具有最高的执行力(最先)。

答案 3 :(得分:0)

请添加一个Servlet过滤器并添加以下代码。 它应该工作。 必须添加“访问控制允许标题”,“ *” 。 不需要创建 proxy.conf.json

@Component

@Order(1) 公共类MyProjectFilter实现了Filter {

@Override
public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
    response.setHeader("Access-Control-Allow-Methods", "GET,POST,PATCH,DELETE,PUT,OPTIONS");
    response.setHeader("Access-Control-Allow-Headers", "*");
    response.setHeader("Access-Control-Max-Age", "86400");
    chain.doFilter(req, res);
}

}