Angular 6到Spring Boot Rest Service CORS问题

时间:2018-11-01 12:03:54

标签: rest spring-boot cors angular6

我已经创建了一个有角度的6应用程序,并将其作为静态Web托管部署在AWS S3存储桶上。 从后端,我创建了一个Spring Boot应用程序,该应用程序公开了其余服务,并在CroosOrigin的控制器和方法级别上进行了注释。它还部署在AWS tomcat EC2实例上。

当我尝试单击angular应用程序中的按钮时,它将尝试调用已部署的spring rest Web服务。在控制台上,我获得了CORS策略:对预检请求的响应未通过访问控制检查:它没有HTTP正常状态。

当我尝试通过邮递员致电这些服务时,它工作正常。我在Chrome中添加了用于CORS的Chrome扩展程序。

当我尝试从angular应用程序调用相同服务时,任何人都可以帮助我为什么它不起作用。

谢谢。

2 个答案:

答案 0 :(得分:1)

尝试将此类过滤器类添加到您的Spring Boot应用程序中:

@Component
public class CorsFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse res = (HttpServletResponse) response;
        HttpServletRequest req = (HttpServletRequest) request;

        res.setHeader("Access-Control-Allow-Origin", "*");
        res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS");
        res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Accept-Encoding, Accept-Language, Host, Referer, Connection, User-Agent, authorization, sw-useragent, sw-version");

        // Just REPLY OK if request method is OPTIONS for CORS (pre-flight)
        if ( req.getMethod().equals("OPTIONS") ) {
            res.setStatus(HttpServletResponse.SC_OK);
            return;
        }
        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {} 
}

答案 1 :(得分:1)

在Spring Boot中,可以启用全局CORS来声明@ConfigurationCorsConfig类,并使用覆盖WebMvcConfigurer的定义@Bean addCorsMappings

@Configuration
public class CorsConfig {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins("*")
                        .allowedHeaders("*");
            }
        };
    }
}

或使用工具MvcConfig定义一个WebMvcConfigurer类,然后覆盖addCorsMappings。如下所示:

@Configuration
public class MvcConfig implements WebMvcConfigurer {
      @Override
      public void addCorsMappings(CorsRegistry registry) {
         registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins("*")
                            .allowedHeaders("*");
                }
            };
        }
}