使用angular 2 http call

时间:2017-11-16 13:43:47

标签: angular spring-boot

我正在尝试从我的角度2前端应用程序调用GET请求到弹簧启动休息微服务,但是当我调用时,只有我收到错误,例如“No 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));
}

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

enter image description here

所以我很困惑,这是来自角度问题或弹簧启动微服务响应问题。任何人都可以帮助找到它的解决方案吗?

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

@Configuration
public class WebConfig extends WebMvcConfigurereAdapter {

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

在Spring here

中阅读有关CORS支持的更多信息

答案 2 :(得分:0)

在你的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;
  }

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

答案 3 :(得分:0)

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

@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);
    }
}

让我知道将其添加到微服务后是否仍然遇到问题。