【问题标题】:Spring Boot microservice response issue with Angular 2 http callAngular 2 http调用的Spring Boot微服务响应问题
【发布时间】:2017-11-16 13:43:46
【问题描述】:

我正在尝试从我的 Angular 2 前端应用程序向 Spring Boot REST 微服务调用 GET 请求,但是当我调用时,我收到如下错误:

请求的资源上没有 Access-Control-Allow-Origin 标头

这是我的控制器操作:

@RequestMapping(value = "/checkUsers", method = RequestMethod.POST)
public String checkLogin(@RequestBody Users user) throws Exception{

    ObjectMapper mapper = new ObjectMapper();
    List<Users> useObj = (List<Users>) userRepo.findAll();
    return(mapper.writeValueAsString(useObj));
}

当我运行我的 Angular 时,我收到了上述错误。我添加了它的截图

这是来自 Angular 问题还是来自 Spring Boot 微服务响应问题?

【问题讨论】:

  • 尝试@pavle-eftimovski 解决方案,并将您的控制器 RequestMethod.POST 更改为 RequestMethod.GET。
  • 是的。我已经跟上了。我得到了回应。感谢您的指导。

标签: angular spring-boot


【解决方案1】:

由于它们在不同的端口上运行,因此您必须在服务器端允许跨域资源共享 (CORS)。 在 Spring Boot 中,您可以通过将 @CrossOrigin 注释添加到处理程序方法来做到这一点:

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

也可以在控制器类级别添加此注释,以便在该类的所有处理程序方法上启用 CORS。

【讨论】:

  • 是的。我得到了回应。它正在工作。感谢您的回复。
【解决方案2】:

公认的答案很好,因为它提供了一个可行的解决方案,但它也迫使您在每个控制器的服务器端硬编码客户端的 URL。您可以改为设置全局 CORS 配置。如果您的 Web 配置扩展了 WebMvcConfigurereAdapter 类,您可以简单地覆盖 addCorsMappings 方法。以下示例为整个应用程序启用 CORS:

@Configuration
public class WebConfig extends WebMvcConfigurereAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

详细了解 Spring 中的 CORS 支持here

【讨论】:

    【解决方案3】:

    在你的 Application.java 中添加一个 bean

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

    它是全局的,它适用于您项目的每个控制器。

    【讨论】:

      【解决方案4】:

      创建一个实现 javax.servlet.Filter 接口的 Spring Boot 组件类并添加所需的标头解决了我的类似问题。

      @Component
      public class YourAppCorsFilter implements Filter{
      
      @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", request.getHeader("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);
          }
      }
      

      如果您在将其添加到您的微服务后仍然遇到问题,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-05
        • 2018-03-18
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多