zoukankan      html  css  js  c++  java
  • jsonp的跨域原理

    在开发测试中,难免会在不同域下进行跨域操作,出于安全性考虑,浏览器中的同源策略阻止从一个域上加载的脚本获取或者操作

    另一个域下的文档属性,这时需要进行跨域的方式进行解决,如:使用jsonp ,iframe等

    1.jsonp的原理

    jsonp,即json+padding,动态创建script标签,利用script标签的src属性可以获取任何域下的js脚本,通过这个特性(也可以说漏洞),服务器端不在返回json格式,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域.

    <!DOCTYPE html>
    <html>
    <head>
        <title>GoJSONP</title>
    </head>
    <body>
    <script type="text/javascript">
        function jsonhandle(data){
            alert("age:" + data.age + "name:" + data.name);
        }
    </script>
    <script type="text/javascript" src="jquery-1.8.3.min.js">
    </script>
    <script type="text/javascript" src="http://www.practice-zhao.com/remote.js"></script>
    </body>
    </html>

    这里调用了跨域的remote.js脚本,remote.js代码如下:

    jsonhandle({
        "age" : 15,
        "name": "John",
    })

    这个是参考文件:https://blog.csdn.net/u011897301/article/details/52679486

    <script type="text/javascript" src="http://www.practice-zhao.com/remote.js"></script>这个代码相当于是执行了

    jsonhandle({"age" : 15,"name": "John",})这个函数。
    2.最后jQuery提供了方便使用JSONP的方式,代码如下:
    <!DOCTYPE html>
    <html>
    <head>
        <title>GoJSONP</title>
    </head>
    <body>
    <script type="text/javascript" src="jquery-1.8.3.min.js">
    </script>
    <script type="text/javascript">
        $(document).ready(function(){
            $.ajax({
                type : "get",
                async: false,
                url : "http://www.practice-zhao.com/student.php?id=1",
                dataType: "jsonp",
                jsonp:"callback", //请求php的参数名
                jsonpCallback: "jsonhandle",//要执行的回调函数
                success : function(data) {
                    alert("age:" + data.age + "name:" + data.name);
                }
    
            });
        });
    </script>
    </body>
    </html>

    3.优缺点

    jsonp优点:

    完美解决在测试或者开发中获取不同域下的数据,用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback。参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
    简单来说数据的格式没有发生很大变化。
    jsonp缺点:

    1.jsonp只支持get请求而不支持post请求,也即是说如果想传给后台一个json格式的数据,此时问题就来了,浏览器会报一个http状态码

    415错误,告诉你请求格式不正确

    2安全问题

    安全防范:

    1.防止callback参数意外截断js代码,特殊字符单引号双引号,换行符存在风险.

    2.防止callback参数恶意添加script标签,造成xss漏洞

    3.防止跨域请求滥用,阻止非法站点恶意调用

    详细请看:http://blog.csdn.net/jian_xi/article/details/66474717

     
     
  • 相关阅读:
    学习进度14
    计算最长英语单词链
    梦断代码阅读笔记02
    梦断代码阅读笔记01
    学习进度13
    评价输入法
    课堂测试——找水王
    第二阶段冲刺05
    实验2
    实验 1 Linux 系统的安装和常用命令
  • 原文地址:https://www.cnblogs.com/shj-com/p/9389334.html
Copyright © 2011-2022 走看看