如何解决 HTTP 状态的 CORS 策略不正确?

Posted

技术标签:

【中文标题】如何解决 HTTP 状态的 CORS 策略不正确?【英文标题】:How to solve CORS policy for HTTP status not ok? 【发布时间】:2020-09-15 22:37:03 【问题描述】:

我收到以下错误:

Access to fetch at 'http://localhost:8080/users/find-all/0' from origin 'http://localhost:3000/' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

我知道有很多这类问题,但我就是无法解决问题。 后端使用 Spring Boot 构建,前端基于 ReactJS。

@GetMapping("/find-all/page")
public PaginatedResultDto<UserDto> findAllPaginated(@PathVariable("page") int page, @RequestParam(defaultValue = NUMBER_OF_ELEMENTS) int numberOfElements) 
    Pageable pageable = PageRequest.of(page, numberOfElements);
    return getBaseFacade().findAllPaginated(pageable);

还有

getPaginatedResults = (pageIndex, resultsPerPage, endpoint, jwt) => 
    const resultsPerPagePath = resultsPerPage !== undefined ? "?numberOfElements=" + resultsPerPage : "";
    const endpointPath = BASE_URL + "/" + endpoint + "/find-all/" + pageIndex + resultsPerPagePath;
    return fetch(endpointPath, 
        method: "GET",
        headers: new Headers(
            "Access-Control-Allow-Headers": "Content-Type, Access-Control-Allow-Headers, Authorization",
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Methods": "DELETE, POST, GET, OPTIONS",
            "Authorization": "Bearer " + jwt
        )
    ).then( .. some error handling here )

我是这样配置WebSecurityConfigurerAdapter的:

protected void configure(HttpSecurity http) throws Exception 
    http.csrf().disable();

    http.authorizeRequests()
            .antMatchers("/users/login").permitAll()
            .antMatchers("/users/find-all/*").hasRole("ADMIN")
            .anyRequest().authenticated()
            .and().sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

我也有一个WebMvcConfigurer

public void addCorsMappings(CorsRegistry registry) 
    registry.addMapping("/**")
            .allowedMethods("*")
            .allowedHeaders("Authorization", "Content-Type");

但我就是无法解决这个问题。我已经尝试了堆栈溢出的所有解决方案,但都没有奏效。

【问题讨论】:

不相关,但在 client 中设置 COR 标头完全没有意义。它说它没有得到一个 OK,检查你的请求和响应数据。 是这个资源服务器、授权服务器还是只是没有任何访问权限的服务器——意味着所有 api 都可以公开访问 @DaveNewton 我在浏览器控制台中登录时收到“TypeError:无法获取”响应。该请求正在与邮递员合作。 baeldung.com/spring-security-cors-preflight 您可能会在飞行前遇到身份验证错误。 @DaveNewton 非常感谢。这解决了我的问题 :) 祝你有美好的一天! 【参考方案1】:

你必须创建CorsConfigurationSource bean,示例如下:

    @Bean
    public CorsConfigurationSource corsConfigurationSource() 
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList(
                "http://localhost:8080",
                "http://localhost:4200",
                "https://localhost:4200"
                )
        );
        configuration.setAllowedMethods(Arrays.asList("DELETE", "GET", "POST", "PATCH", "PUT", "OPTIONS"));
        configuration.setAllowCredentials(true);
        configuration.setAllowedHeaders(
                Arrays.asList(
                        "Access-Control-Allow-Headers",
                        "Access-Control-Allow-Origin",
                        "Access-Control-Request-Method",
                        "Access-Control-Request-Headers",
                        "Origin", "Cache-Control",
                        "Content-Type",
                        "Authorization"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    

稍后在*[Web/Resource]ServerConfigurerAdapter添加以下代码

    @Override
    public void configure(HttpSecurity http) throws Exception 
        http
                .cors().configurationSource(corsConfigurationSource())
                .and()
         ...// Please complete this line to compile
    

【讨论】:

以上是关于如何解决 HTTP 状态的 CORS 策略不正确?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决这个“http://localhost:8080”已被 CORS 策略阻止:对预检请求的响应未通过 vueJS 中的访问控制?

CORS 策略:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态

被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP OK 状态

如何解决 Ionic Angular 应用程序中的 CORS 策略问题?

domain.com 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态

如何使用CORS解决跨域问题