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

获取错误:“Access Control Allow Origin”标头包含多个值“*,*”,但只允许一个值

陶智
2023-03-14

我试图在Java/Spring中的Angular前端和RESTendpoint之间建立连接(我没有开发,也不太清楚)。通过GET,一切正常。通过POST,我在终端中收到消息

已被CORS策略阻止:对预检请求的响应未通过权限改造检查:请求的资源上不存在“访问控制允许源”标头。

在开发工具的网络选项卡中,OPTIONS方法出现错误403

Request Method: OPTIONS
Status Code: 403 
Remote Address: xx.xx.xx.xx:xxxx
Referrer Policy: strict-origin-when-cross-origin

所以,我在互联网上搜索了几次后发现了这种情况,原因是CORS设置:通常,在这种情况下,在帖子之前会发送一个选项调用;但是,由于CORS的原因,不允许进行期权认购。所以,我试着在我的控制器上设置这一行

@CrossOrigin(origins = "*", methods = {RequestMethod.OPTIONS, RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE})

这次错误改变了

Multiple CORS header 'Access-Control-Allow-Origin' not allowed
But the code I added is the only similar to @CrossOrigin, I dind't found others similar.

因此,在根据后CORS问题-没有'访问控制允许源'头存在于请求的资源,我尝试了以下解决方案:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH");
    }
}

@Configurathtml" target="_blank">ion
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
//        http.csrf().disable();
        http.cors();
    }

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        final CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(ImmutableList.of("*"));
        configuration.setAllowedMethods(ImmutableList.of("HEAD",
                "GET", "POST", "PUT", "DELETE", "PATCH"));
        // setAllowCredentials(true) is important, otherwise:
        // The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.
        configuration.setAllowCredentials(true);
        // setAllowedHeaders is important! Without it, OPTIONS preflight request
        // will fail with 403 Invalid CORS request
        configuration.setAllowedHeaders(ImmutableList.of("Authorization", "Cache-Control", "Content-Type"));
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

但这一次,我在控制台中看到的错误变成了

已被CORS策略阻止:“Access Control Allow Origin”标头包含多个值“*,*”,但只允许一个值。

所以,这是我达到的最后一点。我如何解决关于多个值的最后一个错误?每次我处理这个问题,我都提前一步,错误会改变,但它仍然存在。

共有1个答案

楚元章
2023-03-14

只需将此添加到您的WebSecurity配置适配器

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    
/*@Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH");
    }*/ not needed

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // by default uses a Bean by the name of corsConfigurationSource
            .cors(withDefaults())
            ...
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("https://localhost:5000"));// if your front end running on localhost:5000
        configuration.setAllowedMethods(Arrays.asList("GET","POST"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

确保除了上面的代码之外,您没有任何其他过滤器或cors注释

Spring Security留档中的Spring CORS部分。

如果您没有使用Spring Security:

java prettyprint-override">package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }


    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry
                .addMapping("/**")
                .allowedOrigins("*","http://localhost:5000");// list all domains
            }
        };
    }
}
 类似资料:
  • 问题内容: 我正在尝试将获取请求发送到api,就像它是登录网址 我在控制台中收到此错误 XMLHttpRequest无法加载http://demo.software.travel/gptp/api/authorization?apiKey= *&alias = &login = &password = *。“ Access-Control-Allow- Origin”标头包含多个值“ http:/

  • 问题内容: 我有一个带有PHP的NGINX服务器(假设主机名为http://myserver.com)。我有一个PHP脚本,可以从本地主机上的网页通过XHR访问。我将其用作类似于freegeoip.net的GeoIP服务器。 我正在尝试将XHR锁定到特定域。 这是我的配置设置: 我遇到的问题是,当我执行XHR请求时,出现以下错误: 在配置文件中,我只有一个调用,那么为什么会有多个值?有没有办法可以

  • 我试图将get请求发送到api,就像它是一个登录url一样 请求标题:

  • 我试图通过angular以表单形式发布信息,但出现以下错误: 访问位于“”的XMLHttpRequesthttp://localhost:8000/api/register“起源”http://localhost:4200'已被CORS策略阻止:'Access Control Allow Origin'标头包含多个值'*,*',但只允许一个值。登记组成部分ts:43 HttpErrorRespon

  • 嗨,我有相当不错的python和java知识,我最近决定在我的编程方面取得进一步的进步,就是创建我自己的语言,以便在我需要的时候使用和操作。我为eclipse安装了javacc插件,并浏览了一些教程。 我的问题是,当我创建一个新项目(文件 静态=假; “令牌上的语法错误,请删除这些令牌” Eclipse对除类名之外的所有内容都这样做,请注意,项目下的javacc模板没有错误。 请帮我找到一个解决方

  • 问题内容: 我想使我的网站一次只允许一个会话。例如,假设用户已经登录到我在firefox上的网站,如果该用户再次登录到另一台浏览器(例如同一台计算机或另一台计算机上的Opera),则Firefox上的会话将被破坏。但是,如果仍为一届会议,则有关Firefox的会议仍将保留。我可以知道该怎么做吗?我正在使用php和apache。谢谢。 问候。本杰明 问题答案: 我建议您做这样的事情: 假设用户“ A