美文网首页
跨域处理

跨域处理

作者: 木中木 | 来源:发表于2019-10-10 08:34 被阅读0次

    由于浏览器同源策略限制,对于协议不同、主机名不同、端口不同的服务器,不能互相访问资源。

    为什么浏览器会禁止跨域?

    跨域的访问会带来许多安全性的问题,比如,cookie一般用于状态控制,常用于存储登录的信息,如果允许跨域访问,那么别的网站只需要一段脚本就可以获取你的cookie,从而冒充你的身份去登录网站,造成非常大的安全问题,因此,现代浏览器均推行同源策略。

    1.JSONP是一种比较古老的解决方案

    原理:利用script标签的src不受同源策略限制,发出http请求,这种方式只支持get请求,请求到服务器后,服务器根据请求链接参数比如:jsoncallback,把请求解决当成jsoncallback的入参,并返回到客户端,由于请求的文件类型是js,所以浏览器默认会执行jsoncallback变量指定的函数,然后在客户端写一个同名的函数,就能接收到服务器的参数

    下面我们手动实现一个JSONP:

    
     // jsonP实现
    
    function getJSONP(url, callback) {
    
        const script = document.createElement('script');
    
        document.body.append(script);
    
        script.src = `${url}?jsoncallback=${callback}`;
    
        script.remove();
    
    }
    
    getJSONP('https://www.runoob.com/try/ajax/jsonp.php', 'callbackFunction')
    
    // 回调函数实现
    
    function callbackFunction(data){
    
        console.log(data);
    
    }
    
    

    2.可以通过iframe进行POST请求,具体是通过创建一个iframe,在iframe中创建一个form表单,通过表单提交到服务器,然后通过onmessage方法获取结果。

    
    function iframePost(url,callback) {
    
        const iframe = document.createElement('iframe');
    
    
    
        const formEle = `
    
            <form action="${url}" id="formTest" method="POST">
    
                <input name="username" value="linjian" />
    
                <input name="jsoncallback" value="function callbackFunction(data){ window.postMessage(data,'*')};"
    
            </form>
    
            <script>
    
                document.getElementById('formTest').submit();
    
            </script>
    
        `;
    
        // iframe.innerHTML = formEle;
    
        iframe.style.display = 'none';
    
        document.body.appendChild(iframe);
    
        const cwin = iframe.contentWindow;
    
        cwin.document.write(formEle)
    
        // iframe.children[0].submit();
    
        window.onmessage = function(e) {
    
            if (callback) {
    
                callback(e.data);
    
            }
    
        }
    
    
    
    }
    
    iframePost('https://www.runoob.com/try/ajax/jsonp.php', function(data) {
    
        console.log('this is post data', data);
    
    })
    
    

    3.现代跨域解决方案可以用cores技术,core协议配合服务器请求域和请求头部支持方法设置,来完成跨域操作。

    Access-Control-Allow-Origin:所允许原始的请求路径

    Access-Control-Request-Method:该次请求的请求方式

    Access-Control-Request-Headers:该次请求的自定义请求头字段

    相关文章

      网友评论

          本文标题:跨域处理

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