使用 Spring Boot 和 Vue.JS 的 Access-Control-Allow-Origin 多个值

Posted

技术标签:

【中文标题】使用 Spring Boot 和 Vue.JS 的 Access-Control-Allow-Origin 多个值【英文标题】:Access-Control-Allow-Origin multiple values with Spring Boot and Vue.JS 【发布时间】:2019-11-20 10:08:27 【问题描述】:

我的 API 上有这个 CORS 类:

    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.CorsRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

    @Configuration
    public class CorsConfiguration implements WebMvcConfigurer 
        @Override
        public void addCorsMappings(CorsRegistry registry) 
            registry.addMapping("/**").allowedMethods("*").allowedOrigins("*").allowedHeaders("*");

 

Request 返回 200,这是我对前端的回答:

[日期:“2019 年 7 月 10 日,星期三,格林威治标准时间 18:11:54”,服务器:“Apache/2.4.18 (Ubuntu)", Vary:"Authorization", Cache-Control:"no-cache, private", X-Robots-Tag:"noindex", Access-Control-Allow-Origin:"*", Access-Control-Allow-Methods:"POST, GET, PUT, PATCH, DELETE, OPTIONS", Access-Control-Allow-Headers:“授权,内容类型,接受”, Access-Control-Allow-Credentials:"true", Keep-Alive:"timeout=5, max=100", 连接:"Keep-Alive", 传输编码:"chunked", 内容类型:“应用程序/json”]

但在我的 chrome 控制台中,我看到了:

在“http://localhost:3000/api/v1/empresas”访问 XMLHttpRequest 来自原点“http://localhost:8080”已被 CORS 策略阻止: 'Access-Control-Allow-Origin' 标头包含多个值 '*, *',但只允许一个。

我的控制器:

@GetMapping(value = "empresas", produces = "application/json;charset=UTF-8")
public ResponseEntity listaEmpresa(@NotNull @RequestHeader String authorization) throws IOException 
    tokenValidatorService.validaToken(authorization);
    return companyModel.listaEmpresas(authorization);

我能做什么?我没有在我的代码中随时设置访问控制允许来源..

【问题讨论】:

您可以简单地将@CrossOrigin 放在方法的开头。 嗨,苏达尔。 @CrossOrigin 没有结果。如果有帮助,我会添加我的控制器 看起来您可能有另一个过滤器或其他也添加了该标头的东西 - 可能值得使用调试日志记录运行,以查看您是否可以找到可能添加第二个 Access-Control-Allow 的内容- *的来源标题。我在配置错误的 websocket 服务器和 Spring Cloud 网关时遇到了这个问题。 Spring 中的某个点正在添加此标头,但我不知道如何将其配置为不这样做 【参考方案1】:

我通常使用这种配置,它可以工作。

确保@Configuration 类已加载到应用程序上下文中

@Configuration
public class CorsConfiguration 

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

如果您有触发飞行前请求的安全机制,您还必须允许HttpMethod.OPTIONS 在您的所有应用程序上调用,如下所示

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class KsSecurity extends WebSecurityConfigurerAdapter 

    ...

    @Override
    public void configure(WebSecurity web) throws Exception 
        web.ignoring()
                .antMatchers(HttpMethod.OPTIONS, "/**")    // <---------- You need this
                .antMatchers(
                        "/**/*.js,html,css,ico",
                        "/i18n/**",
                        "/assets/**",
                        "/v2/api-docs/**",
                        "/webjars/**",
                        "/swagger-resources/**",
                        "/swagger-ui.html");
    

    ...


【讨论】:

嗨,ValerioMC。 “确保 @Configuration 类已在应用程序上下文中加载”是什么意思?你能证明一下吗?另外,我用过你的课......同样的错误...... @FearX 您的类可能没有被 Spring Boot 应用程序加载。您是否将类放在 SpringBoot 入口点类的子包中?如果你有疑问,你可以放一个记录器并检查它啊启动 更新的答案也允许飞行前请求HttpMethod.OPTIONS【参考方案2】:

如果您使用的是 spring-cloud-gateway api,请在下面尝试

弹簧: 云: 网关: 全球企业: cors配置: '[/]': 允许的来源:“” 允许的方法:“” 允许的标题:“” 允许凭据:true

  routes:
  - id: login-users
    uri: http://localhost:1000/
    filters:
    - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
    predicates:
    - Path=/login/v1/post/login
    - Method=POST
  - id: loginservice
    uri: http://localhost:1001/
    predicates:
    - Path=/login/v1/**
    - Method=POST

【讨论】:

以上是关于使用 Spring Boot 和 Vue.JS 的 Access-Control-Allow-Origin 多个值的主要内容,如果未能解决你的问题,请参考以下文章

全栈的自我修养: 002使用@vue/cli进行vue.js环境搭建 (使用Vue,Spring Boot,Flask,Django 完成Vue前后端分离开发)

Dockerize vue js前端和spring boot后端并部署在kubernetes集群上

Spring Boot + Vue 前后端分离,两种文件上传方式总结

Spring Boot + Vue 前后端分离,两种文件上传方式总结

Spring Boot + Vue 前后端分离,两种文件上传方式总结

Spring Boot Admin