工作生活

跨域方式

2019-07-02  本文已影响0人  糕糕AA

同源策略:不同源的是不能进行请求等操作的,只要满足 协议、主机、端口 一致,则两个页面具有相同的源

跨域:跨域是不可能靠前端单方面解决,总是需要服务器的支持

跨域情况:1、同一父域的子域之间;2、不同父域之间;3、端口不同;4、协议不同

1、document.domain+iframe
(只能解决1):在发起和接收方设置document.domain,并设置为父域的主域名(window.location.hostname);发起方页面创建隐藏的iframe,iframe的源是接收方页面;根据浏览器的不同,通过iframe.contentDocument || iframe.contentWindow.document来获得接收方页面的内容;通过接收方页面的内容与接收方进行交互。(缺点:当一个域被攻击,另一个域有安全漏洞出现)

2、jsonp

(1)代码实现:

var script = document.createElement('script'); // 创建script标签
script.type = 'text/javascript';  // 设置type
// 传参并指定回调执行函数为onBack
script.src = 'http://www.domain2.com:8080/login?user=admin&callback=onBack'; // 设置src,要访问的地址。提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
document.head.appendChild(script); // 将标签插入文档头部
// 回调函数
function onBack(res) {  // 设置回调函数,获取返回的数据,并处理
    alert(JSON.stringify(res));
}
//服务端返回如下(返回时即执行全局函数):
onBack({"status": true, "user": "admin"}) 

(2)jquery ajax:

$.ajax({
    url: 'http://www.domain2.com:8080/login',
    type: 'get',
    dataType: 'jsonp',  // 请求方式为jsonp
    jsonpCallback: "onBack",    // 自定义回调函数名
    data: {}
});

3、Proxy解决跨域问题:

      proxy: {
           '/api': {
             target: 'https://list.jd.com/list.html?cat=1318,1462,1480&callback=jQuery942326&md=9&l=jdlist&go=0',
             pathRewrite: {'^/api' : ''},
             changeOrigin:true, //必须要加,否则是访问自己
            }
        }
  js
         location /api {
                    # 这里也可以录用原有参数,进行复用,并重写URL
                    proxy_pass https://list.jd.com/list.html?cat=1318,1462,1480&callback=jQuery942326&md=9&l=jdlist&go=0;
                }

4、 cors:需要与服务端配合

JSONP只支持GET请求,CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。

反向代理:node,Nginx

同源策略只是浏览器的一个安全策略,只适用于浏览器向服务器发送请求的时候,当服务器跟服务器发送请求的时候,自然就没有这么一层限制,只要是接口,就会返回。

权限不通过的时候,也是会请求成功200的,只是返回的是“需要登录”等信息

上一篇下一篇

猜你喜欢

热点阅读