Spring Boot:即使使用@CrossOrigin,CORS 策略也阻止了从源 FRONTEND 访问 BACK_END' 处的 XMLHttpRequest

Posted

技术标签:

【中文标题】Spring Boot:即使使用@CrossOrigin,CORS 策略也阻止了从源 FRONTEND 访问 BACK_END\' 处的 XMLHttpRequest【英文标题】:Spring Boot : Access to XMLHttpRequest at BACK_END' from origin FRONTEND has been blocked by CORS policy even when @CrossOrigin is usedSpring Boot:即使使用@CrossOrigin,CORS 策略也阻止了从源 FRONTEND 访问 BACK_END' 处的 XMLHttpRequest 【发布时间】:2020-05-04 01:21:41 【问题描述】:

我有一个标有@CrossOrigin(origins = "*", allowedHeaders = "*") 的restcontroller。但是,尽管 @CrossOrigin(origins = "*", allowedHeaders = "*") 在控制器级别,我的请求仍被 CORS 政策阻止。

Access to XMLHttpRequest at 'http://localhost:8080/api/v1/foo/bar' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

下面是代码概要

import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.CrossOrigin;
import javax.mail.MessagingException;
import javax.validation.Valid;
import java.io.UnsupportedEncodingException;

@CrossOrigin(origins = "*", allowedHeaders = "*")
@RestController
@RequestMapping(path="/api/v1")
@AllArgsConstructor
public class SomeRestController 

    @Autowired
    private SomeService someService;


    @PostMapping(path="/foo/bar")
    public ResponseEntity<RespObject> dosomething(@Valid @RequestBody RequestDTO requestDTO) 
    .
    .
    .
    //somecode
    

从 Angular Ui 应用程序调用 api。

APIService.ts

create(candidateInititationDto: CandidateInitiationDTO) 
    return this.httpClient.post<RespObject>(
      "http://localhost:8080/api/v1/foo/bar",
      requestDTO
    );
  
    这是目前这个微服务中唯一的控制器,我已经尝试了所有可能的 @CrossOrigin(origins = "", allowedHeaders = "") , @CrossOrigin,@CrossOrigin( origins = "*") 在控制器级别和方法级别。

这是唯一一个 @CrossOrigin 不工作的微服务。它在所有其他微服务中运行良好。

【问题讨论】:

参考这个***.com/questions/46788969/… 【参考方案1】:

尝试将此 Bean 添加到您的控制器中:

@Bean
public WebMvcConfigurer corsConfigurer() 
    return new WebMvcConfigurerAdapter() 
        @Override
        public void addCorsMappings(CorsRegistry registry) 
            registry.addMapping("/**").allowedOrigins("*");
        
    ;

例如:

@RestController
@RequestMapping(path="/api/v1")
@AllArgsConstructor
public class SomeRestController 

    @Bean
    public WebMvcConfigurer corsConfigurer() 
        return new WebMvcConfigurerAdapter() 
            @Override
            public void addCorsMappings(CorsRegistry registry) 
                registry.addMapping("/**").allowedOrigins("*");
            
        ;
    

    @Autowired
    private SomeService someService;


    @PostMapping(path="/foo/bar")
    public ResponseEntity<RespObject> dosomething(@Valid @RequestBody RequestDTO requestDTO) 
    .
            .
            .
    //somecode

【讨论】:

Nope 即使使用这种方法仍然会遇到同样的问题。【参考方案2】:

尝试删除 origins 和 allowedHeaders 并简单地使用

@CrossOrigin

这也将允许所有请求。

【讨论】:

能否请您粘贴控制器类的完整代码以及导入语句。 我认为这里不需要完整的控制器代码。我在问题中添加了导入语句。【参考方案3】:

终于可以解决问题了。显然,在重构代码时,包名称发生了变化,并且包扫描没有发现它。 Spring 没有抛出 404 ,而是在预检请求中失败。

我遵循的调试步骤。

    删除所有其他控制器

    保持一个控制器和方法尝试调试。

    当我尝试用邮递员打它时,它失败了,我们知道为什么它失败了。 为防止此类灾难再次发生,已进行集成测试 @CrossOrigin(origins = "", allowedHeaders = "") ,@CrossOrigin 。以上所有选项都可以完成这项工作。 最安全的方法是拥有一个全局 CORSS 过滤器和白名单 oring 并使其可配置。

【讨论】:

以上是关于Spring Boot:即使使用@CrossOrigin,CORS 策略也阻止了从源 FRONTEND 访问 BACK_END' 处的 XMLHttpRequest的主要内容,如果未能解决你的问题,请参考以下文章

spring boot使用http响应头传输:编码,但是tcp发送两个数据包即使响应很小

Spring Boot:即使使用@CrossOrigin,CORS 策略也阻止了从源 FRONTEND 访问 BACK_END' 处的 XMLHttpRequest

即使依赖项存在于类路径中,Spring boot 仍显示“无法解析”

即使安装了注释,Spring Boot Xml 查看也不起作用

即使 @Transactional 放置在服务层中,Spring boot JPA 存储库也会提交代码

Spring Boot 2.0.3 Oauth2 安全性:即使在标头中使用访问令牌时也会出现 401 错误