关于javascript:跨域解决方案

3次阅读

共计 1229 个字符,预计需要花费 4 分钟才能阅读完成。

怎么分别跨域:

JSONP

利用了 script 标签可跨域的个性,在客户端定义一个回调函数(全局函数),申请服务端返回该回调函数的调用,并将服务端的数据以该回调函数参数的模式传递过去,而后该函数就被执行了
script,img,link,iframe 不存在跨域申请限度

代码:

callback 这个名字是定死了的,不能改

后端:后端返回 f(‘你好’),刚好这个 f 函数在前端定义了,会立刻执行 f(‘你好’),最初弹窗你好弹框

jquery 的 ajax 办法实现 JSONP

前端:

后盾:

后果:

申请:Jquery3410427…448148 是 jquery 为咱们创立的全局函数,& 前面接了一个变量_,_157…815 是为了革除 get 申请的缓存

返回:

论断:
Jquery 默认帮咱们发 script 申请
Jquery 默认创立全局函数
Jquery 默认执行全局函数时执行胜利回调函数

批改申请头 -CORS 跨域资源共享

前端:

后端:

毛病:
Access-Control-Allow-Origin 写具体地址时只能写一个
Access-Control-Allow-Origin 写 时,就不再容许携带 cookie(浏览器的机制,时携带 cookie 很不平安)

http proxy

应用 webpack 的 devserver 实现,实用于开发阶段调试:

ngnix 反向代理


本地 8080 申请 ngnix 代理服务器 8080,是同源的,不存在跨域限度
ngnix 代理服务器 8080 再去申请真正的服务器 5000,因为服务器与服务器之间通信不会有同源策略管制,同源策略管制只是浏览器的机制。

postMessage

html 页面与页面之间的通信
1001/MESSAGE/A.html 向 1002/MESSAGE/B.html 申请数据:

第 13 行,display:none 是因为这个 iframe 只用来发申请,不展现在页面上
第 17 行 contentWindow 是 iframe 上的一个属性
第 22 行,ev.data 是 B 页面返回的数据
能够在 MDN 上查问 postMessage 的用法:


第 17 行的 ev.data 是接管的 A 页面的数据
第 19 行的 ev.origin 是指 A 页面链接

后果:

WebSocket 协定跨域

这种形式实质没有应用 HTTP 响应头,因而也没有跨域的限度
服务器端:

客户端:

document.domain+iframe

只能实现同一个主域,不同子域下的操作
即能够:v.qq.com 向 sports.qq.com 发送

window.name+iframe

:1001/NAME/A.html:

第 18 行,第一次 onload 是页面初始化的时候,第二次是 iframe.src 被从新赋值后
:1001/NAME/proxy.html:

proxy.html 页面就是一个空代理,只有两头代理 proxy.html 没有设置 window.name,A.html 接管到的还是 B.html 里的 window.name

:1002/NAME/B.html:

后果:

location.hash+iframe



正文完
 0