@CrossOrigin(origins = "*" ) 不适用于 Springboot + React 应用程序

Posted

技术标签:

【中文标题】@CrossOrigin(origins = "*" ) 不适用于 Springboot + React 应用程序【英文标题】:@CrossOrigin(origins = "*" ) not working for Springboot + React app@CrossOrigin(origins = "*" ) 不适用于 Springboot + React 应用程序 【发布时间】:2021-11-19 17:04:32 【问题描述】:

我有一个 Springboot 后端和一个 React 前端,直到今天,它们都运行良好。我能够发送和接收请求/响应。其他 *** 问题/答案都只需添加 @CrossOrigin(origins = "*" ) 但这对我不起作用。

现在,突然间,我收到错误消息:

Access to XMLHttpRequest at 'http://localhost:8080/api/employees' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

但是,据我所知,我确实设置了 CORS。就像我说的那样,它正在工作,但现在即使我没有更改 CORS 起源,它也不能正常工作。

这就是我在 Springboot 后端拥有的:

@CrossOrigin(origins =  "*" )
@RestController
@RequestMapping("/api/")
public class EmployeeController 

    // Auto-inject EmployeeServices Class into this class so we can use the object
    // without calling 'new EmployeeServices'
    @Autowired
    private EmployeeServices employeeServices;

    // GET all employees
    @GetMapping("/employees")
    public List<Employee> getAllEmployees() 
        return employeeServices.getAllEmployees();
    

自上次工作以来我所做的唯一一件事就是添加要求将 JsonWebToken 作为所有请求的header。这适用于邮递员:

我尝试将硬编码的 JWT 添加到我的 axios 请求中,以防 JWT 是给我CORS 错误的原因:

class EmployeeService 
  getEmployees() 
    console.log("getting employees!");
    console.log("Environment variable: " + process.env.NODE_ENV);

    let config = 
      headers: 
        Authorization:
          "Bearer " +
          "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJmb28iLCJleHAiOjE2MzI3ODgwNzgsImlhdCI6MTYzMjc1MjA3OH0.ynUaU9IR893O7uaEjaQ6xPSQh9dEIWdU0DYwwRfXHHM",
      ,
    ;
    return axios
      .get(API_BASE_URL + "employees", null, config)
      .then(console.log("did it!"));
  

但是当我访问网页并让 React 发出请求时,我收到了 CORS 错误。到底是怎么回事? * 不应该启用所有来源吗?我需要在前端列出什​​么来完成这项工作吗?

谢谢!

【问题讨论】:

【参考方案1】:

这是我用的:

@Bean
public CorsConfigurationSource corsConfiguration() 
    CorsConfiguration corsConfig = new CorsConfiguration();
    corsConfig.applyPermitDefaultValues();
    corsConfig.addAllowedOrigin("http://localhost:3000");
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", corsConfig);
    return source;

也许您只需要更改为"/**",但至少这应该让您开始。

编辑:完整示例可能会有所帮助Spring Webflux JWT Security Demo

【讨论】:

这个去哪儿了?什么文件? 我把它放在@Configuration 但我认为任何地方都可以注册一个bean。 nvm 看起来很有效。但是我必须更改我的config 函数才能拥有这一行` http.cors().configurationSource(request -> new CorsConfiguration().applyPermitDefaultValues()); ` 但是现在 jwt 不工作了 嗯,很高兴你让它工作了。我不必向 HttpSecurity 添加任何 cors 配置,但它确实有一个 crsf().disable()。我不认为这有关系。当您构建您的应用程序并从同一来源的服务器/服务静态提供它时,这些问题“消失”了,所以我没有花很多精力来理解这一点。

以上是关于@CrossOrigin(origins = "*" ) 不适用于 Springboot + React 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

我已经允许 @CrossOrigin(origins="*") 注释,但它仍然不起作用。谁能告诉我这里有啥问题?

HTML5 script 标签的 crossorigin 属性到底有啥用

@CrossOrigin Spring Boot 中的正则表达式

link标签中的integrity和crossorigin字段

如何在 Spring 3 中进行 @CrossOrigin 注释?

Spring @CrossOrigin 注解原理(转)