reactjs - 如何修复React和Spring Web应用程序中的cors错误?

标签 reactjs spring-boot

如何修复我的 React 和 Spring 应用程序中的 CORS 错误。

我实现了一个简单的方法来获取用户列表。我已经使用 postman 测试了这个端点。现在,我使用 fetch API 从我的 React js 应用程序中获取此列表。我在 Spring 后端添加了 @CrossOrigin 注释。我还在 React 应用程序中的 package.json 文件中添加了一个代理。

React JS 代码:-

import React from 'react';
import { Component } from 'react';

class DropDownUsers extends Component {
  state = {
    users : [],
    selectedUser : "",
    validationError : ""
  }

  componentDidMount() {

   fetch("http://localhost:8080/api/users")
    .then(data => {
      let usersFromApi = data.map(user => {
        return {
          value : user,
          display : user
        }})
      this.setState({ users : [{value: '', display: '(Choose the user)'}].concat(usersFromApi)});
    })
      .then((response) => {
        return response.json();
      })
      .catch(error => {
        console.log(error);
      });
  }

  render() {
    return (
      <div>
        <select value={this.state.selectedUser}
                onChange={(e) => this.setState({selectedUser: e.target.value})}
         >
         {this.state.users.map((user) => <option key={user.value} value={user.value}> {user.display}</option>)}
        </select>
        <div style={{color:'red',marginTop:'5px'}}>
          {this.state.validationError}
        </div>
      </div>
    )
  }
}

export default DropDownUsers;

错误消息:-

Access to fetch at 'http://localhost:8080/api/users' from origin 'http://localhost:3001' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled

Spring 配置文件:-

public ConfigurableServletWebServerFactory servletContainer() {
        final TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();

        if (ajpEnabled) {
            factory.setProtocol("AJP/1.3");

            factory.addConnectorCustomizers(connector -> {
                connector.setSecure(false);
                connector.setScheme("http");
                connector.setAllowTrace(true);
                connector.setPort(8009);
            });
        }

        return factory;
    }

Spring Controller :-

@Slf4j
@EnableLogging
@CrossOrigin(origins = "http://localhost:3001")
@Path("/users")
public class ListOfUsers {

    @Autowired
    DAO DAO;

    @GET
    @Produces(APPLICATION_JSON)
    public Response execute(@Valid ListOfUsersBean listOfUsersBean) {

        final Optional<List<ListOfUsersBean>> user = DAO.getTotalListOfUsers();
        return status(SC_OK).entity(user).build();
    }

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

}

我想在下拉菜单中列出用户。任何帮助将不胜感激。

最佳答案

我能够解决这个问题。我必须添加一个 CORSFilter 类,如下所示,我在此页面中找到了它:- https://stackoverflow.com/questions/23450494/how-to-enable-cross-domain-requests-on-jax-rs-网络服务:-

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(final ContainerRequestContext requestContext,
                       final ContainerResponseContext cres) throws IOException {
        cres.getHeaders().add("Access-Control-Allow-Origin", "*");
        cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
        cres.getHeaders().add("Access-Control-Allow-Credentials", "true");
        cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        cres.getHeaders().add("Access-Control-Max-Age", "1209600");
    }

}

关于reactjs - 如何修复React和Spring Web应用程序中的cors错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58213391/

相关文章:

java - Springboot 托管 GraphQL Server 不接受内容类型为 "application/json; charset=UTF-8"的查询

java - 使用 JDBC 连接到 Athena 时找不到合适的驱动程序

reactjs - Redux Form、Radio Button Fields、如何支持变量值?

javascript - 当父组件的状态更新时,子组件的 props 不会更新

django - 我如何在 django-rest-framework 中制作 'view_count'?

java - Spring Boot 控制台应用程序不记录任何内容

javascript - React redux,操作有效负载无法在 try/catch block 中看到变量

node.js - npm 开始显示错误,代码为 npm ERR!代码 生命周期

java - 如何使用 springdoc-openapi-webflux-ui 显示应用程序 API 文档?

spring - 无法将 AWS-Postgres 服务器与带有 heroku 托管的 spring boot 应用程序连接起来