跨域訪問之JSONP


跨域

在平常的工作中常常會遇到A站點的需要訪問B站點的資源.

這時就產生了跨域訪問。

跨域是指從一個域名的網頁去請求另一個域名的資源。瀏覽器遵循同源策略,不允許A站點的Javascript 讀取B站點返回的數據。因為A站點的javascript 與B返回的數據不同源的。但是瀏覽器並不阻止A的Ajax請求訪問B,瀏覽器允許A取回B的數據,但是不允許A中的腳本操作B的數據。如下圖所示的③

 

 

 

 

 

同源策略:

數據與操作必須是同源的,否則不能操作。

什么是同源:瀏覽器認為的同源是什么?

判斷是否同源,標准如下

主機名:IP或域名

端口號:

協議:http,https

 

如何解決?

如果操作的腳本與數據同源,那么瀏覽器不會阻止這樣的操作。那么如何做呢?

 

瀏覽器調用js文件時則不受跨域的影響(不僅如此,我們還發現凡是擁有”src”這個屬性的標簽都擁有跨域的能力,比如<script>、<img>、<iframe>,如果能把操作與數據放在一起,那么瀏覽器就會網開一面,對此操作放行。

 

 

 

 
   

 

 

 

這時JSONP 應運而生。

 

JSONP:Jsonp(JSON with Padding) 是 json 的一種"使用模式",可以讓網頁從別的域名(網站)那獲取資料,即跨域讀取數據。

 

實戰

l  項目結構

 

 

 

hbb0b0.mvc.website 站點 hbb0b0/index頁面獲取 站點Hbb0b0.mvc.API 下StudentController/GetStudentList 的數據

 

l  hbb0b0.mvc.website  index頁面代碼如下:

<script type="text/javascript">

        $(function () {

            $.ajax({

                type: "get",

                async: false,

                url: "http://localhost:51250/Student/GetStudentList",

                dataType: "jsonp",

                jsonp: "callback",//傳遞給請求處理程序或頁面的,用以獲得jsonp回調函數名的參數名(一般默認為:callback)

                jsonpCallback: "getStudentList",//自定義的jsonp回調函數名稱,默認為jQuery自動生成的隨機函數名,也可以寫"?",jQuery會自動為你處理數據

                success: function (data) {

                    //alert(data.name);

                    console.log(data);

                },

                error: function () {

                    alert('fail');

                }

            });

 

        });

 

        function getStudentList(list) {

 

            alert();

            console.debug("getStudentList", list);

            $.each(list, function (index, student) {

 

                var html = "<ul>";

                html += "<li> name:" + student.Name + "</li>"

                html += "</ul>";

                $("#divStudentList").append(html);

            });

        }

    </script>

 

 

l  Hbb0b0.mvc.API StudentController/GetStudentList 代碼如下

 

public class StudentController : Controller

    {

        // GET: Student

        public ActionResult Index()

        {

            return View();

        }

 

     

        public ContentResult GetStudentList(string callback)

        {

            const int MAX = 10;

            List<Student> list = new List<Student>();

            for (int i = 0; i < MAX; i++)

            {

                Student st = new Student(i);

                list.Add(st);

            }

 

           string data=  new JavaScriptSerializer().Serialize(list);

            return  Content(string.Format("{0}({1})", callback,data));

        }

    }

 

    public class Student

    {

        public Student(int i)

        {

            this.ID = string.Format("ID:{0}",i.ToString());

            this.Name = string.Format("Hbb0b0{0}", i.ToString());

        }

 

        public string ID

        {

            get;

            set;

        }

 

        public string Name

        {

            get;

            set;

        }

 

        public int Age

        {

            get;

            set;

        }

 

 

}

 

 

l  執行結果:

 

 

 

 

總結

JSONP 雖然能處理跨域問題,但是只能處理get的跨域請求,對於post請求就里不存心了。跨域問題正統的做法是CORS,下篇就介紹下CORS如何解決跨域。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM