【发布时间】:2020-09-30 15:01:49
【问题描述】:
在尝试通过 Angular 连接到我的 Rest API 时,我遇到了一个看似相当简单的 CORS 问题:
跨域请求被阻止:同源策略不允许读取位于http://mserverIP:port/apicontext/getsitebyuserid/userId 的远程资源。 (原因:CORS 标头“Access-Control-Allow-Origin”缺失)。
我的 API 是在 Springboot 中设置的,我已经尝试过以下操作:
在类和方法级别设置 @CrossOrigin(origins = "*") 注释。还启用了跨源的 GET、POST、OPTIONS 以及所有标题。
-
使用以下代码全局设置添加的 CORS 配置:
httpServletResponse.setHeader("Access-Control-Allow-Origin","*"); httpServletResponse.setHeader("Access-Control-Allow-Methods","GET,POST,OPTIONS,HEAD"); httpServletResponse.setHeader("Access-Control-Max-Age", "7200"); httpServletResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, X-Requested-With, accept, authorization, Origin, Access-Control-Request-Method, Access-Control-Request-Headers"); 尝试通过代理身份验证(使用的身份验证是 JWT)。
这条信息可能很重要:对于未经身份验证的 API,不会发生 CORS 问题,但对于受保护的路由,它会返回 403。即使我没有将身份验证标头设置为 true,受保护的路由也会出现问题。
另外,我之前注意到,在预检期间,它的 2 个标头组合会导致问题。如果我发送 origin:http://localhost:4200 和 Access-Control-Request-Method: GET 它会出错。但是,如果我发送其中一个标题,它就可以工作。在 OPTIONS 请求期间,如果有一个名为 origin 的请求头,则请求失败。如果我从邮递员那里删除来源,它会起作用。
【问题讨论】:
-
看起来你的 cross 工作不正常。试试这种方式stackoverflow.com/a/59561352/8403689
-
@Imranmadbar- 这就像一个魅力。谢谢老哥!!
-
好吧@Charan 听起来不错,所以你可以在那里投赞成票。
标签: spring-boot cors preflight cross-origin-read-blocking