一个奇怪的跨域问题

2019-04-01 00:36:56 +08:00
 molvqingtai
前端跨域请求后台接口遇到这么一个奇怪的问题

当我从代码里面发出跨域请求时 Status Code: 200,但是没有返回值

Response Headers



返回值为空



但是我新建一个 html 文件或是直接在控制台发送跨域请求,可以收到返回值
然后自己起一个 node 服务测试也可以收到返回值

Response Headers



有返回值


通过比较我发现后端给我的接口 Response Headers 里面只有两个字段
但是令我疑惑的是,既然后端的配置有问题,为什么我直接在当前应用的控制台或新建 html 发送的发跨域请求却可以收到返回值,而我写在逻辑代码里面的请求却没有返回值?
3405 次点击
所在节点    程序员
13 条回复
hlwjia
2019-04-01 01:58:33 +08:00
首先代码发请求是什么意思?新建 html 发请求又是什么意思?区别是什么?

然后出不一样的返回不是应该看看你请求发出去的是什么内容吗?

你光比人家返回来的内容干嘛?
zhoufenfens
2019-04-01 02:34:36 +08:00
后端设置判断的条件不同。一个是具体域名,一个是星号
gbin
2019-04-01 07:29:49 +08:00
因为你的逻辑请求属于复杂请求,复杂请求跨域时会先发送 OPTIONS 预检请求,该请求没有内容返回,之前写过一篇类似博客,可以参考一下,https://0x400.com/2017-08-02-frontend-learn-about-cros.html

写作水平有限,文中有参考,可以直接看参考。
deepdark
2019-04-01 07:49:09 +08:00
这个 200 但是没有返回值的请求是 OPTIONS,相当于探路的
TomVista
2019-04-01 08:10:55 +08:00
post + json 的请求 是一个复杂请求,包含一个 options 一个 post,复杂请求的 allow-origin 必需指定域名,不能用*号.
xingwing
2019-04-01 08:47:54 +08:00
加这个试试:dataType:'json',
molvqingtai
2019-04-01 09:06:27 +08:00
@hlwjia 可能是我描述不清楚,就是我同一段请求代码我写在逻辑里面的时候,收不到返回值,粘贴再控制台却可以发送,发送的字段当然相同
50infivedays
2019-04-01 09:19:02 +08:00
你没有理解跨域的原理
跨域是浏览器行为 ,你直接去请求根本不会触发跨域
当你在代码中的时候 浏览器才会真正的触发跨域,跨域的流程是先发 preflight 的 options 请求,这个请求没有业务意义,只是询问服务端是否允许跨域
之后如果浏览器觉得满足条件,才会发起真正的请求
molvqingtai
2019-04-01 09:48:51 +08:00
谢谢大家,我把自己 node 的响应头配置复制给菜鸡后端问题解决了
molvqingtai
2019-04-01 09:51:05 +08:00
@50infivedays 我遇到的是 options 预检请求已通过,第二发出的请求没有返回值
xiaoxiuaoliang
2019-04-01 10:12:38 +08:00
@molvqingtai 所以根本原因是?
no1xsyzy
2019-04-01 12:20:01 +08:00
@xiaoxiuaoliang 无 CORS 头,应该是遭遇了不符合跨域导致的 downgrade,请求头被阉了。
50infivedays
2019-04-01 19:55:11 +08:00
@molvqingtai 这确实很奇怪。。。找到原因了吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/550646

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX