彻底搞懂CORS(跨域资源共享)相关内容 什么是CORS 为什么需要CORS 如何解决CORS问题 简单请求 预检

作者: 老朱的IT圈分类: 计算机技术 发布时间: 2023-10-06 07:30:00 浏览:14971 次

彻底搞懂CORS(跨域资源共享)相关内容 什么是CORS 为什么需要CORS 如何解决CORS问题 简单请求 预检

老朱的IT圈:
什么是 CORS,是一种允许服务器端通过 HTTP 标头来控制其他域的页面访问自己资源的机制,需要浏览器实现相关规范; 为什么要 CORS:1-保护服务器;2-保护隐私;3-安全考量;4-因为有实际的跨域请求需求,所以也不能完全禁止跨域请求; CORS 的机制:简单请求,浏览器直接发起请求,适用于轻量服务,少了预检过程,提升响应速度;非简单请求,浏览器会先发起预检过程,适合于消耗资源的服务,可以减轻服务器压力; 解决 CORS 问题:1-同源策略(增加反向代理);2-正确设置 CORS 标头,正确响应 Options 预检请求;3-JsonP [脱单doge] 请大家点赞,投币,分享,弹幕,评论哈 [打call]

【回复】大佬,我自己理解,这些不应该是同源策略的作用嘛,cors/jsonp是为了来跨域的,是哪个地方理解错了吗
阿强不爱阿珍:
跨域是错误的,台湾版本的是没问题的,国内对于源、域、站很多人都分不清,mdn 在去年的时候也改过来了,跨源才是正确的

【回复】回复 @阿强不爱阿珍 :严格来说,跨域是不准确的。CORS 中,包括协议,域名,端口,只要其中之一不同,就是不同的源。而说到跨域,往往给人的错觉是,只有域名不同才算不同源。
小六的abcd:
反向代理服务器去访问不同的域的资源不会有CORS问题么?

【回复】回复 @一枚码农 :CORS 的 3 个要素其中一个是浏览器,反向代理服务器没有浏览器参与,所以那个场景下不存在 CORS 机制 (⌒▽⌒)
【回复】回复 @老朱的IT圈 :对对对,明白了,感谢
震宇6513:
其实,跨域不是不能请求,而是返回的结果被浏览器拒绝

【回复】是的,服务器端是没有办法做这些控制的,必须要求浏览器实现相关的规范,因此千万不能用来历不明的浏览器。
【回复】不准确吧,应该是简单请求和非简单请求的预检请求已经获取到数据但是被拦截,非简单请求的真正请求依然没有发出(不能请求)
【回复】回复 @buchiyu_脏果君 :什么是简单请求?什么是非简单请求
__zq:
下次讲讲corb,我之前遇到过,虽然解决了,但是理解还不够深刻

【回复】回复 @__zq :好的好的,我先记录下 ( ̄▽ ̄)
胡子拉碴不想理:
也就是说,只有浏览器和服务器交互的场景下才存在跨域;服务端与服务端的交互,不会有跨域的问题?

【回复】感觉是这样。我用postman向服务器请求接口数据能行,但用浏览器不行
财富自由之路_:
使用nginx反向代理就变成同源了,这点没理解,望博主解答一下

【回复】我理解这里解决的是前后端架构的跨域问题。使用nginx之后,浏览器的所有请求都只指向nginx,也就是说,对于后端请求(这个时候和nginx不同源),是由nginx转发过去的,浏览器不知道它请求的后端接口是不同源的,所以不会有跨域检查。
【回复】回复 @财富自由之路_ :视频中是 10 分 30 秒开始解释这点,结合视频看,可能稍微直观点。(⌒▽⌒)
bili_06107953f5:
一直有个疑问,access-control-allow-origin只能用星号和一个域名吗?能不能指定多个域名或者正则呢?

【回复】回复 @43157468754_bili :对的,只能星号,或者一个源,或者 null。如果实际允许多个源访问,这个信息可以维护在服务器端,然后返回给前端的时候,将这个 header 设置成发起这个 request 的源就行了。这样的设计主要是浏览器没必要知道其他源是否允许,浏览器只需要关心当前源是否允许,某种程度上也是安全考虑。
【回复】回复 @老朱的IT圈 :顿悟了,多谢[支持]
究极无敌战神:
复杂跨域请求的预检 响应头没有accessalloworigin 和 accessallowmethod 过不了 这是后端配置的问题吗

呵呵灬你一脸:
你们有没有遇到过 访问内网数据被拦截的情况?chrome ver.117

【回复】回复 @呵呵灬你一脸 :不清楚我的理解是否正确,你这个统一用户平台相当于一个黄页,有各个系统的入口,然后有些系统是只允许内网访问。对于从外网访问的用户,就不展示这些系统,而且是在前端进行控制,是想达到这个目的么?我建议在服务端根据客户端的 IP地址来判断是内网还是外网,由此来决定哪些该展示,哪些不该。前端去做类似 Ping的操作,确实很可疑。
【回复】回复 @老朱的IT圈 :chrome://flags/,回车。搜索找到Block insecure private network requests 比如互联网登录统一用户平台,然后里面有些系统只能在内网情况下访问,我们需要先使用类似ping命令查看下当前浏览器能否跳转,如果不能跳转就需要提示用户开启vpn在访问。但是实际情况是这条类似ping命令无法正常返回结果,因为谷歌浏览器做了限制
【回复】回复 @老朱的IT圈 :你理解的很多
羽小乐:
jsonp是用来输出json格式的跨域方式吗,基于回调函数和script

【回复】回复 @羽小乐 :对,是基于回调函数。利用 script 标签的 src 属性指向被调用的URL(只能是 GET 方法),而这个 URL 返回的内容就是可执行的 script 脚本,浏览器会直接执行该返回脚本。注意它返回的是可执行的 javascript 代码,而不是 json,jsonp 这个名字可能会让人误解。
胡子拉碴不想理:
在说到用nginx解决cors的问题的例子这里,我理解应该只是解决了前后端跨域的问题,但是如果我从其它站点用脚本请求到nginx,这样是不是还会有跨域?

Tomycl:
你一说跨源,我立马茅塞顿开,拨云见日了!!!翻译成“跨域”确实不如“跨源”方便理解

CORS 跨域资源共享 必剪创作 程序员研究所

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!