代码之家  ›  专栏  ›  技术社区  ›  Dan

CORS阻止我进行API调用

  •  0
  • Dan  · 技术社区  · 6 年前

    我有一个应用程序,是运行在两个码头集装箱,一个前端(反应.js)以及后端(java、spring)。

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

    注意到这个问题后,我调查了一下,发现了一个问题 here 一个用户 gok 提供了一些有用的信息和 spring docs

    我已经将更改应用到我的后端代码,因为我是在一个 earlier question 在发现问题之前是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);
        }
    }
    

    注意 我试过用 localhost frontend

    控制器

    @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).
    

    任何帮助或洞察这将不胜感激。

    2 回复  |  直到 6 年前
        1
  •  1
  •   drowny    6 年前

    我以前是这样做的,你能试试吗?和你尝试的不同,我加了一些 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);
        }
    }
    

    你可以删除用exposeHeaders方法编写的无需头文件。所以你的问题是不暴露 "Access-Control-Allow-Origin" . 你只能用这个或更多。

        2
  •  0
  •   Pradip Karki    6 年前

        @CrossOrigin(origins = "http://frontend:3000")
        @GetMapping(value = "/address/create")
        public ResponseEntity<String> getNewAddress() {
          ...}