同源策略與跨域訪問

一、同源策略javascript

  想要了解跨域訪問,就要必須先了解同源策略。同源策略其實就是由Netscape提出的一個著名的安全策略。html

  a、那爲何要提出同源策略呢?主要就是爲了安全。java

    舉個例子,假如你正在訪問一家銀行的網站,而後你又打開了一個網站,這是一個惡意網站,惡意網站中的ajax請求銀行的網站,這時候請求會帶上銀行網站的cookie,此時數據就泄露了。jquery

  b、那同源策略又是怎麼防範這種狀況的產生的呢?ajax

    同源指的是兩個頁面擁有相同的協議、端口和主機。這樣,惡意網站中的ajax就不能攜帶你銀行網站的cookie請求你的銀行網站了。django

  c、那爲何script能採用外部的連接?按照上面所講應該不能使用外部的jquery。json

    那是由於雖然同源策略是Netscape提出的,可是倒是由瀏覽器廠家去執行的,他們將同源策略稍微改動了一下,也就是說,瀏覽器中的<script><img><iframe><link>等能夠直接加載跨域資源,而不受同源策略限制。被同源策略限制的行爲包括:cookie、localStorage和IndexDB沒法讀取;DOM沒法得到;AJAX請求不能發送。可是,瀏覽器限制了javascript,使其不能讀寫加載的內容。跨域

二、跨域請求瀏覽器

  jsonp跨域安全

    jsonp是數據格式json的一種使用模式,就是利用了script能夠直接加載跨域資源的特色。經過觀察network能夠看出,jsonp發送的get請求的類型是JS,而非XHR。

    

    使用django簡單實現jsonp跨域請求:

      index.html

<!DOCTYPE html>
<html>
<head>
    <title>JSONP</title>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<button class='jsop_test'>測試</button>
<script>
    $(".jsop_test").click(function () {
        $.ajax({
            url:"http://127.0.0.1:8008/jtest/service/",
            type:"get",    
            dataType:"jsonp",     // 僞造ajax  基於script
            jsonp: 'name',
            jsonpCallback:"laowang",
            success:function (data) {
                console.log(data)
            }
        })
    })
</script>
</body> </html>

      views.py

from django.shortcuts import render
from django.http import HttpResponse
import json

# Create your views here


def Index(request):
    return render(request, "index.html", locals())

def jsonp_test(request):
    func = request.GET.get("callbacks", "")
    print(func)
    info = {"name":"laowang","age":18}
    return HttpResponse(json.dumps(info))

      開啓兩個服務器,一個使用127.0.0.1:8000另外一個使用127.0.0.1:8008。這時,想要在8000端口的服務器請求8008端口的服務器,按照同源策略是不能請求的,可是,咱們將json改爲jsonp就能請求到了。若是不使用jsonp就會在console中報一下的錯誤。

相關文章
相關標籤/搜索