美文网首页
jsonp跨域解析

jsonp跨域解析

作者: newway_001 | 来源:发表于2019-08-27 11:18 被阅读0次

    背景:

    由于浏览器同源策略的限制,非同源下的请求,都会产生跨域问题,jsonp即是为了解决这个问题出现的一种简便解决方案。

    什么是同源?

    同源策略即:同一协议,同一域名,同一端口号。当其中一个不满足时,我们的请求即会发生跨域问题。

    举个简单的例子:

    http://www.abc.com:3000https://www.abc.com:3000的请求会出现跨域(协议不同)
    http://www.abc.com:3000http://www.abc.com:3001的请求会出现跨域(端口不同)
    http://www.abc.com:3000http://www.def.com:3000的请求会出现跨域(域名不同)

    我们注意到src和href都可以进行跨域请求(一个get请求)

    jsonp就是使用通源策略这一“漏洞”,实现的跨域请求(这也是jsonp跨域只能用get请求的原因所在)。想象一下,既然是个get请求,那么服务端一定可以接收到,并做出反馈。ok,知道这两点之后,我们开始具体使用jsonp进行跨域请求。

    
    <button id="btn">点击</button> 
     <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> 
     <script>   
     $('#btn').click(function(){            
    var frame = document.createElement('script');           
    frame.src = 'http://localhost:3000/article-list?name=leo&age=30&callback=func'; 
    $('body').append(frame);    
        
    });             
    function func(res){         
    alert(res.message+res.name+'你已经'+res.age+'岁了');     
    }  </script>
    
    

    上述代码其实是一个get请求,服务器对于get请求一定可以收到,并做出回应。

    贴一下服务器的流程

    router.get('/article-list', 
    (req, res) => {  
    console.log(req.query, '123'); 
     let data = {    
    message: 'success!',    
    name: req.query.name,    
    age: req.query.age  
    } 
     data = JSON.stringify(data)  
    res.end('func(' + data + ')');});
    

    看到返回的是'func(' + data + ')',到前端就是调用回调函数。

    其实jsonp的整个过程就类似于前端声明好一个函数,后端返回执行函数。执行函数参数中携带所需的数据。

    相关文章

      网友评论

          本文标题:jsonp跨域解析

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