同源策略Jsonp

同源策略

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

 

何为同源:

  协议,域名,端口都相同

  如果非同源,那么在请求数据时,浏览器会在控制台中报一个异常,提示拒绝访问。

Jsonp

  jsonp是json用来跨域的一个东西。原理是通过script标签的跨域特性来绕过同源策略。

<script src="http://code.jquery.com/jquery-latest.js"></script>

自己在客户端定义的回调函数的函数名传送给服务端,服务端则会返回以你定义的回调函数名的方法,将获取的json数据传入这个方法完成回调:

#客户端
<button class="send_ajax">send_ajax</button>

<script>
    //点击编写事件
    $(".send_ajax").click(function () {

       kuayu_request("http://127.0.0.1:8000/send_ajax/?callback=bar")   //自己组建的回调函数名为bar

    });
    //自己组建跨域的<script>标签
    function kuayu_request(url) {
        var $script=$("<script>");  // 创建script标签,是一个jquery对象: <script>
        $script.attr("src",url);
        $("body").append($script);
        $("body script:last").remove();
    }
    //回调函数
    function bar(arg) {
       console.log(arg);
       console.log(JSON.parse(arg));
    }

</script>
客户端
def send_ajax(request):

 

    import json

 

    dic={"k1":"v1"}

 

    print("callback:",request.GET.get("callback"))

    callbacks=request.GET.get("callback")

 

    return HttpResponse("%s('%s')"%(callbacks,json.dumps(dic)))
服务端

jQuery对JSONP的实现

getJSON

jQuery框架也当然支持JSONP,可以使用$.getJSON(url,[data],[callback])方法

#客户端
<button onclick="f()">sendAjax</button>

<script>

    function f(){
          $.getJSON("http://127.0.0.1:7766/SendAjax/?callbacks=?",function(arg){
            alert("hello"+arg)
        });
    }
    
</script>

#fuwuduan 不改动。
结果是一样的,要注意的是在url的后面必须添加一个callback参数,这样getJSON方法才会知道是用JSONP方式去访问服务,callback后面的那个问号是内部自动生成的一个回调函数名。
getJSON方法

$.ajax

<script>

    $(".send_ajax").click(function () {

        $.ajax({
            url:"http://127.0.0.1:8000/send_ajax/",
            dataType:"jsonp",   // 跨域请求  <script>
            jsonp: 'callbacks',   //拼接回调函数,callbacks为键
         jsonpCallback:"SayHi"  //回调函数的函数名,SayHi为值
        })


    });

    function SayHi(arg) {      //回调函数
        console.log("hello",arg)
    }
</script>
方式一:规定好的回调函数名
import json
def send_ajax(request):
    func_name=request.GET.get("callbacks")
    print("========",func_name)                              #jQuery32108857898425508359_1515120720532
    s = {"name": "egon", "age": 122}
    return HttpResponse("%s('%s')"%(func_name,json.dumps(s)))
方式一的服务端
<script>

    $(".send_ajax").click(function () {

        $.ajax({
            url:"http://127.0.0.1:8000/send_ajax/",
            dataType:"jsonp",   // 跨域请求  <script>
            jsonp: 'callbacks',  //jQuery帮助随机生成的:callbacks="asdfadf1123141"
            success:function (data) {
                console.log(data)
            }
        })

    });


</script>
方式二:回调函数随机生成函数名

 

posted @ 2018-06-28 16:40  程先生_Python  阅读(93)  评论(0编辑  收藏  举报