从源“http://localhost:8080/”访问“https://xxx”被 CORS 策略阻止(不存在“Access-Control-Allow-Origin”标头)错误
Posted
技术标签:
【中文标题】从源“http://localhost:8080/”访问“https://xxx”被 CORS 策略阻止(不存在“Access-Control-Allow-Origin”标头)错误【英文标题】:Access at 'https://xxx' from origin 'http://localhost:8080/' blocked by CORS policy (No 'Access-Control-Allow-Origin' header present) error 【发布时间】:2021-04-18 19:40:56 【问题描述】:我目前正在本地测试我的应用程序(后端:springboot,前端:带有 axios 的 vue.js)并且我通过 PUT 请求收到此错误(我不知道它是 PUT 的事实是否是错误,但我测试的其他请求没有显示此错误)
我知道这是一个经常报告的错误,但我测试了我在互联网上找到的所有解决方案,但没有任何效果
我测试过:
在我的控制器上添加这个:
@CrossOrigin(origins = "*")
在产生错误的请求上添加同一行
改为添加:
@CrossOrigin(origins = "http://localhost:8080")
在我的 cors 配置 bean 中添加这个:(这个实际上在其他请求上添加了新的 cors 错误)
@Bean
CorsConfigurationSource corsConfigurationSource()
final CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("*"));
configuration.setAllowedMethods(Arrays.asList("*"));
configuration.setAllowCredentials(true);
configuration.setAllowedHeaders(Arrays.asList("*"));
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
添加这个 bean
@Bean
public WebMvcConfigurer configurer()
return new WebMvcConfigurer()
@Override
public void addCorsMappings(CorsRegistry registry)
registry.addMapping("/*")
.allowedOrigins("*");
;
在 axios 请求中添加此标头:
"Access-Control-Allow-Origin": '*' ,
我承认我在这里有点迷路了。有人可以帮忙吗?
编辑:它是 PUT 的事实确实是错误的根源,即使我真的不知道为什么。但是如果我将其转换为 POST 请求,它就可以正常工作了
【问题讨论】:
你从 curl 中得到了什么? @k-wasilewski 没问题 您确定没有截取代码中其他地方的响应吗?例如一些 jwt... @k-wasilewski 我有一个 jwt 授权过滤器,我想问题可能来自那里,但我真的不知道如何 【参考方案1】:因此,在您的 JWT 相关类中查找任何拦截响应的内容并将其添加到那里:
response.setHeader("Access-Control-Allow-Origin", "*");
【讨论】:
【参考方案2】:我不确定,但我也已经从 chrome 浏览器解决了 CORS 问题。 你应该检查 axios 和 vuejs 的代理配置。 当我配置代理时,它就解决了。
或
HA 代理或一些负载均衡器可能是您需要访问的 https:// 前面的服务。
【讨论】:
【参考方案3】:将 @CrossOrigin(origins = "*") 添加到控制器对我也不起作用。 一直对我有用的是添加一个在每个请求上执行的过滤器。
@Component
public class Filter extends OncePerRequestFilter
@Override
protected void doFilterInternal( HttpServletRequest request, HttpServletResponse
response, FilterChain filterChain )
throws ServletException, IOException
response.addHeader( "Access-Control-Allow-Origin", "*" );
response.addHeader( "Access-Control-Allow-Methods", "*" );
response.addHeader( "Access-Control-Allow-Headers", "*" );
filterChain.doFilter( request, response );
【讨论】:
是的,我已经有一个授权过滤器,我尝试向其中添加标题,但它不起作用以上是关于从源“http://localhost:8080/”访问“https://xxx”被 CORS 策略阻止(不存在“Access-Control-Allow-Origin”标头)错误的主要内容,如果未能解决你的问题,请参考以下文章
带有 Angular 的 Spring Boot。从源“http://localhost:4200”访问“http://localhost:8080/”的 XMLHttpRequest 已被 CORS
从源“http://localhost:8080”访问“API_URL”处的 XMLHttpRequest 已被 CORS 策略阻止:
从源“http://localhost:8080/”访问“https://xxx”被 CORS 策略阻止(不存在“Access-Control-Allow-Origin”标头)错误
从 localhost:4200 访问 localhost:8080 的 XMLHttpRequest 已被 CORS 策略阻止
如何解决这个“http://localhost:8080”已被 CORS 策略阻止:对预检请求的响应未通过 vueJS 中的访问控制?