首頁 >web前端 >js教程 >關於javascript中跨域問題的解決方法分享

關於javascript中跨域問題的解決方法分享

黄舟
黄舟原創
2017-07-18 10:02:191455瀏覽

這篇文章主要介紹了javascript 跨域問題以及解決辦法的相關資料,需要的朋友可以參考下

javascript 跨域問題以及解決方案

什麼是跨域問題?

跨域這個問題是由於瀏覽器的同源策略引起的,請求的URL位址,必須與瀏覽器的URL是相同協定、相同網域名稱、相同連接埠的,否則是不允許訪問的

##http://www.123.com/indexhttp://www.456.com/server網域不相同,跨網域#http://www.123.com:8080/indexhttp://www.123.com:8888/index.htm連接埠不同,跨域http://www.123.com/index#https://www.123.com/index
瀏覽器URL 要存取的URL
http://www.123.com/index http://www.123.com/server

#協議不同,跨域

解決方案

#凡是擁有src屬性的標籤都可以跨域,例如script、img、iframe標籤

JSONP


JSONP就是應用了script標籤,JSONP的全名是JSON With Padding,JSONP由兩部分組成,回掉函數和數據,回掉函數就是當回應到來時應該在頁面中呼叫的函數,回掉函數的名字是在請求中指定的,而資料就是傳入回掉函數的JSON資料

範例:

#

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

<script type="text/javascript">
  function jsonCallback(data){
    alert(data);
  };
  var url = "http://localhost:8888/test?callback=jsonCallback";
  var script = document.createElement(&#39;script&#39;); 
  script.type = "text/javascript";
  script.setAttribute(&#39;src&#39;, url); 
  document.getElementsByTagName(&#39;head&#39;)[0].appendChild(script);
</script>
</head>
<body>
</body>
</html>

缺點:確認JSONP請求是否失敗並不容易

安全性的問題,JSONP是從其他網域載入程式碼執行,所以要確定其可靠性

產生跨域問題的原因

跨域問題是瀏覽器同源策略限制,目前網域的js只能讀取同域下的視窗屬性。


跨網域問題產生的場景

當要在頁面中使用js取得其他網站的資料時,就會產生跨網域問題,例如在網站中使用ajax請求其他網站的天氣、快遞或其他數據介面時以及hybrid app中請求數據,瀏覽器就會提示以下錯誤。這種場景下就要解決js的跨域問題。

XMLHttpRequest cannot load http://你请求的域名. No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource. Origin &#39;http://当前页的域名&#39; is therefore not allowed access.

哪些情況會產生跨域問題

一個網站的網址組成包括協議名,子域名,主域名,端口號。例如 https://github.com/ ,其中https是協議名,www是子域名,github是主域名,連接埠號碼是80,當在頁面中從一個url請求資料時,如果這個url的協議名、子網域、主網域、埠號任一個有一個不同,就會產生跨域問題。

即使是在 http://localhost:80/ 頁面請求 http://127.0.0.1:80/ 也會有跨域問題


解決跨域問題

解決跨網域問題有以下一種方式

使用jsonp

服務端代理程式

服務端設定Request Header頭中Access-Control-Allow-Origin為指定可取得資料的網域名稱

#jsonp的解決方式

json≠jsonp######原理#######jsonp解決跨域問題的原理是,瀏覽器的script標籤是不受同源策略限制(你可以在你的網頁中設定script的src屬性問cdn伺服器中靜態檔案的路徑)。那就可以使用script標籤從伺服器取得數據,請求時加入一個參數為callbakc=?,?號時你要執行的回呼方法。 ###

以上是關於javascript中跨域問題的解決方法分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn