这是一个 api ,是 bing 的每日壁纸: https://cn.bing.com/HPImageArchive.aspx?n=1&format=js&idx=0
打开后,前端得到的是一串匿名的 json 数据,没有赋值给任何变量,也没有输入到任何一个 callback 函数中,所以无法做到通过 jsonp 来得到数据,但直接通 ajax 来获取又会出现跨域报错,单纯靠前端有无办法利用这类 api 吗?
或者换句话说,假设我在控制台输入一串纯 json 数据,没有复值和传入函数中,它是以什么形式存在于内存中的?还是说输入后就已经丢失了?
1
devliu1 2021-12-19 11:41:14 +08:00
主要是浏览器预设的安全限制,可以放到后端,写浏览器扩展,或者写个 cors 代理
|
2
mostkia OP @devliu1 嗯,不靠前端的方法脑子里一过就有很多种,比如说吧这个地址反向代理到自己的域名下,这就不跨域了,或者是 php CURL 解析后吐出来给前端用,不过这并不是我的期望解决方法,主要还是想看看大伙是不是还有更好的方法在前端上做到,目前看来是做不到的。感觉 jsonp 局限性很大啊,还是需要服务器提供支持才行,我要有控制权,我还不如直接在服务器端代码里允许跨域呢。
|
3
renmu123 2021-12-19 12:03:15 +08:00 via Android 1
如果有,那你不就绕过跨域了?那跨域还有什么意义呢?
|
4
thinkershare 2021-12-19 12:14:12 +08:00 1
没有, 不要指望了, jsonp 本来就已经是不安全的, 你还想这样搞, 如果人家返回的东西变了, 直接对用户页面注入
|
5
devliu1 2021-12-19 12:15:06 +08:00 1
所以结果是没有,有也是类后端的方法
|
6
vance123 2021-12-19 12:31:34 +08:00 1
架设代理服务器转发,或者魔改 webview 转发,没其它方法
|
7
ch2 2021-12-19 12:39:35 +08:00 1
别人的网站不想跟你合作,你就只能偷过来
要不然我把 V2EX 内置到我自己的网站里,你们 cookie 我都能拿到,你觉得合适吗? |
9
mostkia OP |
11
xiadd 2021-12-19 12:54:31 +08:00 via iPhone 1
用 serverless cloudflare worker 应该可以
|
12
shintendo 2021-12-19 13:02:33 +08:00 2
哪有纯前端手段突破跨域限制的,jsonp 也不是啊
|
13
mostkia OP @shintendo jsonp 算是历史遗留问题吧,阻止跨域 js 包调用可能很大一批站点都会故障,以后不知道会不会严格起来连这种调用也不被允许。
|
14
Mutoo 2021-12-19 14:01:46 +08:00 via iPhone 1
纯前端的解决方案是有的。可以用开放式反向代理服务去 ajax 这个请求。例如 https://cors-anywhere.herokuapp.com/corsdemo
项目地址 https://github.com/Rob--W/cors-anywhere |
15
wangyu17455 2021-12-19 14:30:47 +08:00 1
用云函数做转发
|
16
mostkia OP @wangyu17455 @Mutoo 好的,感谢,有空会了解一下的
|
17
MonoLogueChi 2021-12-19 16:38:56 +08:00 via Android
@Mutoo 这哪是纯前端的方案,也是后端代理,跨域是浏览器限制,所谓纯前端的方案在我的理解中是不能实现的,即使是能实现,也会被当做漏洞去修复。想要跨域,要么是后端代理(非特指运行在服务器上的后端,也包括相同工作原理的浏览器插件),要么是修改浏览器设置,要么是用客户端。
|
18
Mutoo 2021-12-19 17:20:31 +08:00
@MonoLogueChi 对开发者来说,如果你可以直接使用公共资源完成反向代理而不需要自己去架设后端,那我就认为它是纯前端可以完成的。
而且这类资源还蛮多的 https://nordicapis.com/10-free-to-use-cors-proxies/ |
19
liuhailiang 2021-12-19 17:44:58 +08:00 1
可以试试看 iframe 能不能解决,当前页隐藏一个 iframe 其中调用 api 获取数据写在隐藏域里。
需要看下 iframe 和父 frame 如何相互获取数据 很古老的时期前端会用 iframe 解决跨域问题 |
20
justin2018 2021-12-19 17:50:07 +08:00 1
https://cors.eu.org/https://cn.bing.com/HPImageArchive.aspx?n=1&format=js&idx=0
netnr/workers: Cloudflare Workers https://github.com/netnr/workers |
21
janxin 2021-12-19 18:22:01 +08:00 1
浏览器 Extension
|
22
mostkia OP 除了速度慢一些,没毛病 @Mutoo 随便试了 2 个项目:分别是 http://www.whateverorigin.org/和 https://allorigins.win/ 前者不支持 https 和 ajax 请求,后者直接支持 https 和 cors ,所以没提供 jsonp 支持输出依旧是原始数据,挺好的。对于懒癌或者不想折腾服务器配置的人的确几乎等于纯前端的方案了,但密集请求或者追求高稳定的服务,还是自己搭一个在本地比较靠谱。
|
23
mostkia OP @justin2018 可以,没毛病,都是类似的技术。但的确解决了问题。谢谢解答的朋友
|
24
rpman 2021-12-19 22:57:06 +08:00 1
如果有不走代理就能跨域的方法,那就是浏览器的安全性 bug
|
25
SmiteChow 2021-12-20 09:54:03 +08:00 1
使用 extension 突破 我写了一个 https://github.com/DistPub/escape-cookie-samesite-policy 缺文档警告
|