当前位置: 首页 > 知识库问答 >
问题:

CORS阻止我进行API调用

梁德馨
2023-03-14

我有一个在两个docker容器上运行的应用程序,一个前端(react.js)和一个后端(java、Spring)。

我已经安装并运行了这些容器,可以验证它们是否可以通过ping相互通信。

注意到这个问题后,我研究了一下,发现了一个问题,一个用户gok提供了一些有用的信息和到spring文档的链接,这些信息非常丰富。

在发现问题是CORS问题之前,我已经按照前面问题中的指示将更改应用到后端代码。

因此,通过阅读spring文档,我将以下内容应用于我的课程

配置

@Configuration
@EnableWebMvc
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/blockchain/**")
            .allowedOrigins("http://frontend:3000")
            .allowedHeaders("*")
            .allowedMethods("*")
            .maxAge(3600);
    }
}

注意:我尝试了本地主机和前端(容器名称)的映射名称,但都没有成功

控制器

@RestController
@RequestMapping(value = "/api/blockchain")
public class BlockchainController {

    @CrossOrigin
    @GetMapping(value = "/address/create")
    public ResponseEntity<String> getNewAddress() {
        String newAddress = blockchainService.getNewAddress();

        if (StringUtils.isNotBlank(newAddress)) {
            return new ResponseEntity<String>(newAddress, HttpStatus.OK);
        }

        return new ResponseEntity<String>(HttpStatus.INTERNAL_SERVER_ERROR);
    }

注意:在被问及控制器类还有更多内容之前,我只包括了必要的内容。

控制台错误

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://multichain-api:8080/api/blockchain/address/create. (Reason: CORS request did not succeed).

这个错误总是出现,并且自从我在我的应用程序中包含cors配置以来一直没有改变。容器日志中也没有显示任何错误。

任何对此的帮助或见解都将不胜感激。

共有2个答案

万俟渝
2023-03-14

这对我在当地的工作很有效。

    @CrossOrigin(origins = "http://frontend:3000")
    @GetMapping(value = "/address/create")
    public ResponseEntity<String> getNewAddress() {
      ...}
陆俊迈
2023-03-14

我以前是这样做的,你能试试吗?与您尝试的不同,我添加了一些exposedHeaders()。

@Configuration
@EnableWebMvc
public class WebConfiguration implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/blockchain/**")
                .allowedOrigins("http://frontend:3000")
                .allowedHeaders("*")
                .allowedMethods("*")
                .exposedHeaders("Access-Control-Allow-Headers",
                        "Access-Control-Allow-Origin, Origin, Accept, X-Requested-With, " +
                                "Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers")
                .maxAge(3600);
    }
}

你可以删除用exeHeaders方法编写的不需要的标头。所以你的问题是没有公开“Access-Control-Allow-Origin”。你只能使用这个或更多。

 类似资料:
  • 当我试图使用axios对Tomcat 8服务器进行API调用时,出现了以下错误。 被CORS策略阻止:请求的资源上不存在“Access Control Allow Origin”标头。

  • 问题内容: Ajax使用回调,因为它是同步的。 我希望对远程URL块的调用直到出现一些答案为止 ,就像在Ajax中一样,但是没有异步部分,或者我要说要进行JAX调用。 是否有任何技术可以使以下事情发生(使用JQuery)(…使用JQuery或其他解决方案): 我只是想知道-想学习。 实际上,有时会阻塞直到回复合适为止。我并不是说要浏览器阻止,而只是脚本运行时。 问题答案: 您可以在使用jQuery

  • 我正在尝试使用keycloak从现有的localhost(localhost:3000)登录页面进行登录。Keycloak在另一台主机上运行(http://kchost:38080)。我知道这不是推荐的登录方式,但我需要尽快适应现有的系统。 尝试卷曲: 错误是:CORS策略阻止了从来源“http://localhost:3000”访问位于“http://kchost:38080/auth/real

  • 我正在与Django合作一个项目,该项目通过React前端上的Django Rest框架通过API提供数据。可浏览的API工作正常,但是,react前端在控制台中给出了一个错误。 我已成功安装django cors标头。 CORS策略阻止从http://127.0.0.1:8000/products/http://localhost:3000获取数据:请求的资源上不存在访问控制允许来源标头。如果不

  • 我在本地主机上用Spring Boot配置了一个api。我的Spring Boot控制器应该允许CORS请求,因为我正在使用@CrossOrigin: 当使用Postman/cURL测试时,一切都工作正常(但cURL不关心CORS策略...)。现在,我正试图使用axios从我的反应应用程序中访问重新来源“http://localhost:8081/api/images”。我得到以下响应头,它确定请

  • 我在使用https域和https套接字io时收到此警告。 我的代码是这样的: 希望有答案来解决这个问题。我已经从其他人那里搜索过,但我申请时发现不起作用。