美文网首页
jsonp跨域的理解

jsonp跨域的理解

作者: 艾石溪 | 来源:发表于2017-06-17 10:52 被阅读29次

    1: 跨域的理解
    说起跨域就必须要提同源策略,浏览器问了安全,制定了同源策略,即同协议、同域名、同端口号,若其中有一点存在不同就会违背同源策略,导致无法获得数据。(若是非同源的,其实浏览器会向服务器发起请求,但是会拒绝接收服务器返回的数据)
    举例:在本地存在2个项目,web1和web2,同时运行在两个端口3000和3001,当web1向web2发起请求http://localhost:3001/ajax/deal时,就会造成跨域问题。

    2:jsonp
    既然这么容易跨域,那就得想解决方法。我们发现,当在web1中,使用

    <script src="http://localhost:30001/test.js"></script>
    

    发现script标签并没有同源的限制,我们可以正常获得test.js。jsonp就是利用script标签的这个特点,在本地创建一个回调函数,然后在远程服务上调用这个函数,并且将需要的数据拼接成json数据的形式作为参数传递,完成回调。
    其实jsonp的实质就是将json数据填充进回调函数,jsonp = json+padding。
    举例:web2中服务端的一段代码

    public class MyService : IHttpHandler
        {
            public void ProcessRequest(HttpContext context)
            {
                //获取回调函数名
                string callback = context.Request.QueryString["callback"];
                //json数据
                string json = "{\"name\":\"chopper\",\"sex\":\"man\"}";
    
                context.Response.ContentType = "application/json";
                //输出:回调函数名(json数据)
                context.Response.Write(callback + "(" + json + ")");
            }
    
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }
    

    web1中页面中代码

     <script type="text/javascript">
        function addScriptTag(src){
            var script = document.createElement('script');
            script.setAttribute("type","text/javascript");
            script.src = src;
            document.body.appendChild(script);
        }
        
        window.onload = function(){
            //调用远程服务
            addScriptTag("http://localhost:20002/MyService.ashx?callback=person");
            
        }
        //回调函数person
        function person(data) {
            alert(data.name + " is a " + data.sex);
        }
    </script>
    

    3: 由于script的原理 所以jsonp只适用于get方法请求。
    4:强烈推荐深入浅出jsonp, 很赞

    相关文章

      网友评论

          本文标题:jsonp跨域的理解

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