同源策略和跨域

2019-01-14  本文已影响0人  mingzihhh

同源策略

跨域

1.) 资源跳转: A链接、重定向、表单提交
2.) 资源嵌入: <link>、<script>、<img>、<frame>等dom标签,还有样式中background:url()、@font-face()等文件外链
3.) 脚本请求: js发起的ajax请求、dom和js对象的跨域操作等

跨域解决方案

JSONP(JSON with padding)

前端实现:

      document.querySelector('.show').addEventListener('click',function(){
            var script = document.createElement('script');
            script.src = 'http://127.0.0.1:8080/getWeather?callback=showData';
            document.head.appendChild(script);
            document.head.removeChild(script);
        })

后端部分代码:

 case '/getWeather':
            var weather = [
                '北京:晴',
                '杭州:阴',
                '上海:多云'
            ]
            res.setHeader('Content-Type','text/json;charset=utf-8')
            if(pathObj.query.callback){
                res.end(pathObj.query.callback + '(' + JSON.stringify(weather) + ')')
            }
            else{
                 res.end(JSON.stringify(weather))

            }  
            break;
CORS

前端实现:

        document.querySelector('.show').addEventListener('click',function(){
            var xhr = new XMLHttpRequest();
            xhr.open('GET','http://127.0.0.1:8080/getWeather',true);
            xhr.onload = function(){
                if((xhr.status>=200&&xhr.status<=300)||xhr.status==304) { 
                    showData(JSON.parse(xhr.responseText)); 
                }else{ 
                    console.log('error'); 
                }
            } 
            xhr.onerror=function(){ 
                console.log('error'); 
            } 
            xhr.send();
        })

后端部分代码:

case '/getWeather':
            var weather = [
                '北京:晴',
                '杭州:阴',
                '上海:多云'
            ]
            res.setHeader('Access-control-Allow-Origin','http://a.com:8080')
            res.end(JSON.stringify(weather))

            break;

降域: document.domain + iframe跨域
postMessage跨域

以上具体实现见https://github.com/mingzihhh/cross-domain-demo

参考资料:

https://segmentfault.com/a/1190000011145364

MDN文档

上一篇下一篇

猜你喜欢

热点阅读