美文网首页
跨域的解决方法

跨域的解决方法

作者: 727上上上 | 来源:发表于2017-10-03 13:19 被阅读0次

    JSONP的跨域方式

    是JSON的一种模式,html中script标签可以引入其他域下的js,比如引入线上的jquery库。利用这个特性,可实现跨域访问接口
    需要后端支持
    服务器愿意提供接口
    数据返回前需要提前定义好数据处理函数
    创建script标签,src的地址执行后端接口,最后加个参数callback=数据处理函数名这个参数可以让返回的数据以数据处理函数名(data)的字符串形式输出,以此调用数据处理函数
    例子
    script部分

    document.querySelector(对象).addEventListnner('操作',function(){
        var script=document.createElement('script')//创建一个元素
        script.src='路径?callback=数据处理函数'//设定地址
    })
    function 数据处理函数(){}
    

    router.js部分

    app.get('路径',function(req,res){
        var 返回数据=[xx]
    
        var cb = req.query.callback;
        if(cb){
            res.send(cb + '('+ JSON.stringify(返回数据) + ')');
        }else{
            res.send(返回数据);
        }
    })
    

    CORS的跨域请求方式

    是AJAX的一种跨域请求方式,使用 XMLHttpRequest 发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:Origin,后台进行一系列处理,如果确定接受请求则在返回结果中加入一个响应头Access-Control-Allow-Origin 浏览器判断该相应头中是否包含 Origin 的值,如果有则浏览器会处理响应,我们就可以拿到响应数据,如果不包含浏览器直接驳回,这时我们无法拿到响应数据。
    res.header('Access-Control-Allow-Origin','(此处输入同意对象的URL)')
    例子
    script部分

    ducument.querySelector(对象).addEventListnner('操作',function(){
        
        var xhr=new XMLHttpRequest()
        xhr.open('get','路径',true)
        xhr.send()
        xhr.onreadystatechange =function(){
            if(xhr.readyState ===4 && xhr.status===200){
                appendHtml(JSON.parse(xhr.responseText))
            }
        }
    })
    function appendHtml(){}
    

    router.js部分

        app.get('路径',function(req,res){
            var 返回数据=[xx]
    
            res.header('Access-Control-Allow-Origin','(此处输入同意对象的URL)') //也可输入'*',表示同意所有
            res.send(返回数据)
        })
    

    使用降域进行跨域

    操作iframe
    window.frames[0].document.querySelector('input').value='xxx'获取iframe里面的输入框后对其赋值,当子域名不同时不能进行操作,因此需要进行降域
    document.domain=''降到相同的父域名,且主域名必须相同
    例子
    script部分
    页面a

    document.querySelector('input').addEventListener('input',function(){//选中页面a的input进行绑定操作
        window.frames[0].document.querySelector('input').value=this.value//对iframe(即页面b)里的input属性进行赋值
    })
    document.domain='同一二级域名或主域名'//重要部分修改域名
    

    页面b

    document.querySelector('input').addEventListener('input',function(){//选中页面b的input进行绑定操作
        window.parent.document.querySelector('input').value=this.value//对window父对象中的Input进行赋值
    })
    document.domain='同一二级域名或主域名'//重要部分修改域名
    

    相关文章

      网友评论

          本文标题:跨域的解决方法

          本文链接:https://www.haomeiwen.com/subject/pznxyxtx.html