我有一个Spring Boot应用程序,它公开了一些端点。我想从React应用程序向这些端点发出请求,但它一直给我带来CORS问题:
CORS策略已阻止从来源’ http:// localhost:3000 ‘ 访问’localhost:9090 / helios-admin / api / dashboard / clients?page = 0&size = 30’处的XMLHttpRequest :跨来源请求仅支持协议方案:http,数据,chrome,chrome扩展名,https。
因此,我尝试@CrossOrigin对所有方法以及Controller类使用批注,但是错误是相同的。 我的应用程序中的get请求如下所示:
@CrossOrigin
constructor() { this.url = 'localhost:9090/helios-admin/api/dashboard/clients?page=0&size=30'; } getProjectStatusById(projectId) { Axios.get(this.url).then(res=>{ console.log(res.data); }) }
少了什么东西?
编辑 在我的Spring Boot应用程序中,我只有此类可配置安全性:
@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(securedEnabled = true, jsr250Enabled = true, prePostEnabled = true) public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired SysdataUserDetailsService sysdataUserDetailsService; @Autowired private JwtAuthEntryPoint jwtAuthEntryPoint; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .userDetailsService(sysdataUserDetailsService) .passwordEncoder(encoder()); } @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and().csrf().disable().authorizeRequests() .antMatchers(PathConstants.USER_AUTH +"/**", PathConstants.HELIOS+"/dashboard/**").permitAll() .antMatchers(HttpMethod.GET, "/"+PathConstants.PROCESS_DEFINITION+"/**").permitAll() .antMatchers(HttpMethod.POST, "/"+PathConstants.PROCESS_DEFINITION+"/**").permitAll() .antMatchers(HttpMethod.GET, "/"+PathConstants.PROCESS_INSTANCE+"/**").permitAll() //.anyRequest().authenticated() .anyRequest().permitAll() .and() .exceptionHandling().authenticationEntryPoint(jwtAuthEntryPoint).and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); // custom jwt filter. http.addFilterBefore(jwtAuthFilter(), UsernamePasswordAuthenticationFilter.class); } }
您可以通过重写添加它addCorsMappings的WebMvcConfigurerAdapter,所以无论是创建一个类 扩展 WebMvcConfigurerAdapter或定义你这样的配置类一个bean:
addCorsMappings
WebMvcConfigurerAdapter
@Bean public WebMvcConfigurer corsConfigurer () { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://domain1.com", "http://domain2.com") .allowedMethods("GET", "OPTIONS") .allowedHeaders("header1", "header2", "header3") .exposedHeaders("header1", "header2") .allowCredentials(false).maxAge(3600); } } }
编辑
从5.0版开始WebMvcConfigurerAdapter不推荐使用,因此您可以通过实现WebMvcConfigurer接口来实现相同的功能(添加了默认方法,感谢Java 8!并且可以直接实现而不需要此适配器)
WebMvcConfigurer
@Configuration @EnableWebMvc public class MyWebMvcConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://domain1.com", "http://domain2.com") .allowedMethods("GET", "OPTIONS") .allowedHeaders("header1", "header2", "header3") .exposedHeaders("header1", "header2") .allowCredentials(false).maxAge(3600); } }