ajax跨域問題(三種解決方案)

爲什麼會出現跨域

  • 跨域問題來源於JavaScript的同源策略,即只有 協議+主機名+端口號 (如存在)相同,則允許相互訪問。也就是說JavaScript只能訪問和操作自己域下的資源,不能訪問和操作其他域下的資源。跨域問題是針對JS和ajax的,html本身沒有跨域問題,比如a標籤、script標籤、甚至form標籤(可以直接跨域發送數據並接收數據)等

如何解決跨域問題

  • JSONP
      JSONP是JSON with Padding的略稱。它是一個非官方的協議,它允許在服務器端集成Script tags返回至客戶端,通過javascript callback的形式實現跨域訪問(這僅僅是JSONP簡單的實現形式)。關於jsonp的使用方式,可以參考http://blog.csdn.net/alen1985/article/details/6365394,優缺點可以參考http://blog.csdn.net/z69183787/article/details/19191385  
  • 添加響應頭,允許跨域
      addHeader(‘Access-Control-Allow-Origin:*’);//允許所有來源訪問
      addHeader(‘Access-Control-Allow-Method:POST,GET’);//允許訪問的方式
  • 代理的方式
    服務器A的test01.html頁面想訪問服務器B的後臺action,返回“test”字符串,此時就出現跨域請求,瀏覽器控制檯會出現報錯提示,由於跨域是瀏覽器的同源策略造成的,對於服務器後臺不存在該問題,可以在服務器A中添加一個代理action,在該action中完成對服務器B中action數據的請求,然後在返回到test01.html頁面。

Demo1(添加允許跨域請求的響應頭)

  • html頁面

  • Web後臺


    按照上面的訪問,由於127.0.0.1:8080和localhost:8081的域和端口不同,所以同樣會出現跨域問題。

現在用添加響應頭的方式


Demo2(jsonp的callback方式)

這裏演示的是jquery的ajax,後臺採用的是webservice接口形式

注意此時的dataType爲jsonp格式,看看後臺的接收

我們返回的其實就是一個函數的調用文本,這裏注意,callback的名稱,由於前臺沒有指定callback函數,所以這裏自動生成了,如果想自定義回調函數名稱如下操作,添加一行請求參數

這樣後臺的回調函數名就變成了mytest

瀏覽器發出的請求格式和響應數據如下,其實就是返回函數的調用,而需要返回的數據則以函數參數值的形式填入

此時控制檯就能夠獲取到“hello world”

推薦參考資料:
http://www.cnblogs.com/chopper/archive/2012/03/24/2403945.html

發佈了40 篇原創文章 · 獲贊 77 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章