Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring CORS No';访问控制允许原点';标题已存在_Spring_Spring Mvc_Cors - Fatal编程技术网

Spring CORS No';访问控制允许原点';标题已存在

Spring CORS No';访问控制允许原点';标题已存在,spring,spring-mvc,cors,Spring,Spring Mvc,Cors,在将web.xml移植到java配置之后,我遇到了以下问题 No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access. 根据一些Spring参考,尝试了以下尝试: @Configuration @ComponentScan(basePackageClasses = App

在将web.xml移植到java配置之后,我遇到了以下问题

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:63342' is therefore not allowed access.
根据一些Spring参考,尝试了以下尝试:

@Configuration
@ComponentScan(basePackageClasses = AppConfig.class, useDefaultFilters = false, includeFilters = {
        @Filter(org.springframework.stereotype.Controller.class) })
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/*").allowedOrigins("*").allowedMethods("GET", "POST", "OPTIONS", "PUT")
                .allowedHeaders("Content-Type", "X-Requested-With", "accept", "Origin", "Access-Control-Request-Method",
                        "Access-Control-Request-Headers")
                .exposedHeaders("Access-Control-Allow-Origin", "Access-Control-Allow-Credentials")
                .allowCredentials(true).maxAge(3600);
    }

}
选择的值取自正在运行的web.xml筛选器:

<filter>    
<filter-name>CorsFilter</filter-name>
<filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
<init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
</init-param>
<init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
</init-param>
<init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
</init-param>
<init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
<init-param>
    <param-name>cors.support.credentials</param-name>
    <param-value>true</param-value>
</init-param>
<init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>10</param-value>
</init-param> </filter> <filter-mapping>

<filter-name>CorsFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

克斯菲尔特
org.apache.catalina.filters.CorsFilter
科尔斯
*
cors.methods
获取、发布、头部、选项、放置
cors.allowed.headers
内容类型、X-Requested-With、accept、Origin、访问控制请求方法、访问控制请求标头
cors.exposed.headers
访问控制允许来源,访问控制允许凭据
cors.support.credentials
真的
cors.preflight.maxage
10
克斯菲尔特
/*

您知道为什么Spring java配置方法不能像web.xml文件那样工作吗?

如果您使用的是Spring Security版本>=4.2,您可以使用Spring Security的本机支持,而不包括Apache:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

上面的示例是从Spring复制的,在Spring中,您还可以找到有关如何在控制器上配置CORS、特定控制器方法等的信息。此外,还有XML配置示例以及Spring引导集成。

registry.addMapping(“/*”)更改CorsMapping
addCorsMappings
方法中的
to
registry.addMapping(“/**”

看看这个春天的CORS

从—


为整个应用程序启用CORS非常简单:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}
您可以轻松更改任何属性,也可以仅将此CORS配置应用于特定的路径模式:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
            .allowedOrigins("http://domain2.com")
            .allowedMethods("PUT", "DELETE")
            .allowedHeaders("header1", "header2", "header3")
            .exposedHeaders("header1", "header2")
            .allowCredentials(false).maxAge(3600);
    }
}

为整个控制器启用CORS-

@CrossOrigin(origins = "http://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}
您甚至可以使用控制器级和方法级CORS配置;然后,Spring将合并来自两个注释的属性,以创建合并的CORS配置

@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin("http://domain2.com")
    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

我们遇到了同样的问题,我们使用Spring的XML配置解决了它,如下所示:

将其添加到上下文xml文件中

<mvc:cors>
    <mvc:mapping path="/**"
        allowed-origins="*"
        allowed-headers="Content-Type, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Authorization, X-Requested-With, requestId, Correlation-Id"
        allowed-methods="GET, PUT, POST, DELETE"/>
</mvc:cors>

有用的提示-如果使用Spring data rest,则需要一种不同的方法

@Component
public class SpringDataRestCustomization extends RepositoryRestConfigurerAdapter {

 @Override
 public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
    config.getCorsRegistry().addMapping("/**")
            .allowedOrigins("http://localhost:9000");
  }
}

根据Omar的回答,我在REST API项目中创建了一个名为
WebConfig.java
的新类文件,配置如下:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

  @Override
  public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**").allowedOrigins("*");
  }
} 

这允许任何来源访问API,并将其应用于Spring项目中的所有控制器。

Omkar的回答相当全面

但全局配置部分的某些部分已更改

根据

从版本4.2开始,SpringMVC支持CORS。使用控制器方法 在Spring Boot中使用@CrossOrigin注释的CORS配置 应用程序不需要任何特定的配置。全球CORS 可以通过注册WebMvcConfigurer bean来定义配置 使用自定义的addCorsMappings(CorsRegistry)方法,如中所示 下面是一个例子:

然而,本文中的大多数答案都是使用
WebMVCConfigureAdapter

从Spring5开始,您只需要实现接口 WebMVCConfiguer:

public class MvcConfig implements WebMvcConfigurer {
这是因为Java8在接口上引入了默认方法 介绍WebMVCConfigureAdapter类的功能


我还收到一些消息,如请求的资源上没有“Access Control Allow Origin”头。起源'http://localhost:63342因此,不允许访问。

我已经正确地配置了COR,但是RouterFunction中webflux缺少的是accept和contenttype头应用程序\u JSON,就像这段代码:

@Bean
RouterFunction<ServerResponse> routes() {
    return route(POST("/create")
                              .and(accept(APPLICATION_JSON))
                              .and(contentType(APPLICATION_JSON)), serverRequest -> create(serverRequest);
}
@Bean
路由函数路由(){
返回路线(POST(“/create”)
.和(接受(应用程序)
.and(contentType(APPLICATION_JSON)),serverRequest->create(serverRequest);
}

正如@Geoffrey所指出的,使用spring security,您需要一种不同的方法,如下所述:
出于某种原因,如果仍然有人无法绕过CORS,请编写浏览器希望访问您的请求的标题

在配置文件中添加这个bean

@Bean
public WebSecurityConfigurerAdapter webSecurity() {
    return new WebSecurityConfigurerAdapter() {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.headers().addHeaderWriter(
                    new StaticHeadersWriter("Access-Control-Allow-Origin", "*"));


        }
    };
}
通过这种方式,我们可以告诉浏览器,我们允许从所有来源进行交叉来源。如果要从特定路径进行限制,请将“*”更改为{“”,“”}


帮助性参考了解此行为

我通过使用@CrossOrigin注释在spring boot中找到了解决方案

@RestController
@CrossOrigin
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

公共类跟踪系统应用程序{

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

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedOrigins("http://localhost:4200").allowedMethods("PUT", "DELETE",
                        "GET", "POST");
            }
        };
    }

}

这就是我在经过大量的尝试和研究后,如何解决访问控制允许原点出现问题的方法

在添加了Spring安全性之后许多开发人员面临跨源问题,这就是该问题的解决方法

  • 添加自定义筛选器类的定义

    public class CsrfTokenLogger implements Filter {
    
     private Logger logger =
          Logger.getLogger(CsrfTokenLogger.class.getName());
    
    @Override
    public void doFilter(
    ServletRequest request, 
    ServletResponse response, 
    FilterChain filterChain) 
      throws IOException, ServletException {
    
      Object o = request.getAttribute("_csrf");
      CsrfToken token = (CsrfToken) o;
    
     filterChain.doFilter(request, response);
      }
     }
    
  • 在配置类中添加自定义筛选器

    @Configuration
    public class ProjectConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) 
    throws Exception {
    
    http.addFilterAfter(
            new CsrfTokenLogger(), CsrfFilter.class)
        .authorizeRequests()
            .antMatchers("/login*").permitAll()
            .anyRequest().authenticated();
     }
    }
    

  • 我用这种方法解决了同样的问题。基本上,添加这个
    @EnableWebSecurity
    注释和添加
    protectedvoidconfigure(HttpSecurity http)会引发异常{}

    对此进行更改:

    @Configuration
    public class WebConfig {
    
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedMethods("*");
            }
        };
    }
    
    }

    对此

    @Configuration
    @EnableWebSecurity
    public class WebConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**").authorizeRequests().antMatchers("/**").permitAll().anyRequest().authenticated();
        http.cors().and().csrf().disable();
    }
    
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedMethods("*");
            }
        }; 
      }
    }
    

    为整个应用程序启用CORS对我不起作用。使用
    addCorsMapping
    对我不起作用,我忍不住想说这是因为spring安全性…,但是按照建议添加
    corsConfigurationSource
    bean解决了我的问题。也不要忘了允许所有客户端注册。addMapping(“/**”)。AllowedOriginations(*”);你真是个救命恩人。我正在使用Spring 4.2,并尝试了无数其他替代方案,但在我尝试addCorsMappings覆盖方式之前,它们都不起作用。添加了标准CORS标头以及访问控制Allow Headerists 2020,Spring boot注释仍然不起作用。感谢这篇文章。我当我注意到你的帖子说SpringDataREST使用了一种不同的方法时,我有点失去了希望。现在完全适合我了!
    RepositoryRestConfigurerAdapter
    @Configuration
    public class WebConfig {
    
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedMethods("*");
            }
        };
    }
    
    @Configuration
    @EnableWebSecurity
    public class WebConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**").authorizeRequests().antMatchers("/**").permitAll().anyRequest().authenticated();
        http.cors().and().csrf().disable();
    }
    
    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**").allowedMethods("*");
            }
        }; 
      }
    }