跨域 has been blocked by CORS policy

作者:木子云舒
时间:2021年11月19日14:14:02

背景:
之前也会遇到跨域的问题,但是之前一般是前后端自己写,所有很快就解决了。这次遇到跨域,设置了一些参数,但是不生效。也没有搞清楚,究竟跨域是什么,什么情况会出现跨域,怎么验证是否已解决跨域,底层究竟是前端,服务器,浏览器哪一个环节出现了问题。
通过多次试错,加上和几个同事朋友的沟通后,大概知道了是哪里的问题。
所以说搞懂原理比其他都重要,这样才能定位问题,才知道是否解决了。

总结:
跨域,全称跨源资源共享(CORS)。一般是浏览器设置的安全策略。
当浏览器中的本系统访问其他系统的资源的时候会出现跨域的问题。

何为跨域?
Url的一般格式:
协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址

只要协议,子域名,主域名,端口号这四项组成部分中有一项不同,就可以认为是不同的域,不同的域之间互相访问资源,就被称之为跨域。

----------------正确设置-----------------
// 跨域,访问源控制
response.setHeader(“Access-Control-Allow-Origin”, “*”);

---------------------------分割线-------------------------
一般会报错如下:

XXXXX(请求的跨域url)has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested rource.

在这里插入图片描述

上面的错误信息说了几个信息:
①请求来源是origin xxxxx
②被cors 政策拦截了
③响应头中没有’Access-Control-Allow-Origin’ 头部信息

这几个信息很关键。
---------------------------分割线-------------------------

我之前以为跨域是发生在请求的时候,所以我认为跨域应该是前端解决,因为他发的请求嘛。肯定还没有到我后端,应该他在请求头中设置 ‘Access-Control-Allow-Origin’。后来发现这是错误的,应该是响应头中设置。
这也是验证是否设置了允许跨域请求的重点。之前的响应中是没有 'Access-Control-Allow-Origin’信息的。

*****所以应该在响应头中设置 “Access-Control-Allow-Origin”:”*“

******所以跨域可以通过后端解决,前端完全不用管。

下面我们整理一下跨域请求的流程:

前端请求的时候分为简单请求和复杂请求,简单请求是不会有跨域问题的。

css,js,

发起一个复杂请求的时候,会先发送请求到接口去 “域检”,这个概念很关键。并且域检是采用OPTION请求,所以要允许OPTION请求。
所谓的跨域检,是正式发起请求前先去判断是否允许跨域。
之后的请求就不会进行跨域检了。

这里也说明了及时被拦截不允许跨域,那么也是请求了接口的,只是还没有执行具体的业务逻辑。

所以设置允许跨域要在第一行设置。
或者采用全局拦截器进行设置。

我的项目中采用的Jfinal 框架,一般我们可以写在具体controller方法的第一行,但是我这个请求是采用hander处理的,那么也必须要写在第一行。
在这里插入图片描述

同时,我发现网上说的jfinal添加全局拦截器,我测试的时候没有生效。

其他:

spring boot 跨域解决办法
1.方法或controller上 使用@CrossOrigin注解
2.全局跨域设置
3.filter
可参考:https://www.cnblogs.com/zhaosq/p/11410682.html

听说是官方文档:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS
后续进行研究后补充。
文档能从官方获取最好从官方获取,因为网络上的博客不一定适合的情况。

地点:成都天府软件园
仅此纪念多年忘记的博客。

  • 13
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CORS跨域资源共享(Cross-Origin Resource Sharing)的缩写。它是一种机制,用于控制在一个域名下的网页应用能否访问另一个域名下的资源。当浏览器发起跨域请求时,如果被请求的资源服务器没有正确设置CORS相关的响应头,浏览器会阻止该请求,提示"has been blocked by CORS policy"的错误信息,其中"No 'Access-Control-Allow-Origin' header is present on the requested resource"表示请求头中缺少"Access-Control-Allow-Origin"字段。这通常是出于安全考虑,防止未经授权的网站访问数据。要解决这个问题,服务器端需要设置响应头中的"Access-Control-Allow-Origin"字段,指定允许访问的域名或者使用通配符"*"表示允许所有域名进行访问。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [解决前后端跨域报错:has been blocked by CORS policy: No ‘Access-Control-Allow-Origin](https://blog.csdn.net/wsaicyj/article/details/127814374)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [跨域 has been blocked by CORS policy](https://blog.csdn.net/LiJianbo_Jon/article/details/121422632)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [跨域问题解决办法 (has been blocked by CORS policy:Response……) 原因及解决办法](https://blog.csdn.net/weixin_35773751/article/details/123615866)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值