成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你應該知道如何跨域

開發 開發工具
轉眼就是秋招季啦。經歷了幾場筆試面試,屢次被問到關于如何實現跨域。老實說,之前都是紙上談兵,也沒有項目需要跨域,甚至覺得這個東西沒什么意義。直到今天項目中遇到了跨域問題,看了不少資料才理解跨域的普遍性和意義。特寫此篇文章整理自己所得。

[[171703]]

前言

轉眼就是秋招季啦。經歷了幾場筆試面試,屢次被問到關于如何實現跨域。老實說,之前都是紙上談兵,也沒有項目需要跨域,甚至覺得這個東西沒什么意義。直到今天項目中遇到了跨域問題,看了不少資料才理解跨域的普遍性和意義。特寫此篇文章整理自己所得。

轉自個人博客: 關于跨域

什么是跨域

一般來說,如果你在開發中需要進行跨域操作(從一個非同源網站發送請求獲取數據),一般而言,你在瀏覽器控制臺看到的結果為:

XMLHttpRequest cannot load http://external-domain/service. No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin ‘http://my-domain’ is therefore not allowed access.

同源策略

說到跨域就不得不提“同源策略”。

同源策略是Web瀏覽器針對惡意的代碼所進行的措施,為了防止世界被破壞,為了保護世界的和平,Web瀏覽器,采取了同源策略,只允許腳本讀取和所屬文檔來源相同的窗口和文檔的屬性。

那么,怎么判斷文檔來源是否相同呢?很簡單,看三個部分: 協議、主機、端口號。只要其中一個部分不同,則不同源。

跨域的應用場景

  1. 來自 home.example.com 的文檔里的腳本讀取 developer.example.com載入的文檔的屬性。
  2. 來自 home.example.com 的文檔里的腳本讀取 text.segmentfault.com載入的文檔的屬性。

如何跨域

設置domain屬性

針對上述應用場景的***種情況,可以設置Document對象的domain屬性。但是設置時使用的字符串必須具有有效的域前綴或者它本身。

PS: domain值中必須有一個點號。

PS: domain不能由松散的變為緊繃的。

  1. //初始值 "home.example.com"  
  2. document.domain = "example.com"; //OK 
  3. document.domain = "home.example.com"; //NO,不能由松散變緊繃 
  4. document.domain = "example"; //NO,必須有一個點號 
  5. document.domain = "another.com"; //NO, 必須是有效域前綴或其本身  

JSONP

JSONP由兩部分組成: 回調函數和數據。

原理:通過動態<script>元素來使用,可以通過src屬性指定一個跨域URL。

  1. function handler(data){ 
  2.     console.log(data); 
  3.  
  4. var script = document.createElement("script"); 
  5. script.src = "https://segmentfault.com/json/?callback=handler"
  6. document.body.insertBefore(script, document.body.firstChild);  

除此之外,還可以利用jQuery來實現。 

  1. function jsonCallback(json){ 
  2.   console.log(json); 
  3.  
  4. $.ajax({ 
  5.   url: "http://run.plnkr.co/plunks/v8xyYN64V4nqCshgjKms/data-2.json"
  6.   dataType: "jsonp" 
  7. }); 

 運行結果如下:

 

某些API(例如Github API)允許你定義一個回調函數,當請求返回時執行該函數。 

  1. function logResults(json){ 
  2.   console.log(json); 
  3.  
  4. $.ajax({ 
  5.   url: "https://api.github.com/users/jeresig"
  6.   dataType: "jsonp"
  7.   jsonpCallback: "logResults" 
  8. }); 

 運行結果如下:

 

優點:

  1. 兼容性強。
  2. 簡單易用,能之間訪問響應文本,支持瀏覽器與服務器之間雙向通信。

不足:

  1. 只能用GET方法,不能使用POST方法
  2. 無法判斷請求是否失敗,沒有錯誤處理。

跨域資源共享CORS

需要瀏覽器和服務器同時支持。

原理:使用"Origin:"請求頭和"Access-Control-Allow-Origin"響應頭來擴展HTTP。其實就是利用新的HTTP頭部來進行瀏覽器與服務器之間的溝通。

針對前端代碼而言,變化的地方在于相對路徑需改為絕對路徑。 

  1. //以前的方式 
  2. var xhr = new XMLHttpRequest();  
  3. xhr.open("GET""/test"true);  
  4. xhr.send();  
  5. //CORS方式 
  6. var xhr = new XMLHttpRequest();  
  7. xhr.open("GET""http://segmentfault.com/test"true);  
  8. xhr.send();   

針對服務器代碼而言,需要設置Access-Control-Allow-Origin,顯式地列出源或使用通配符來匹配所有源。

優點:

  1. CORS支持所有類型的HTTP請求。
  2. 使用CORS,開發者可以使用普通的XMLHttpRequest發起請求和獲得數據

不足:

  1. 不能發送和接收cookie

更新:服務端可以通過設置Access-Control-Allow-Credentials該字段來表示是否允許發送Cookie。發送ajax請求時,需配置withCredentials屬性。(感謝sf小伙伴@lloyd_zhou 指正)

具體可查看 阮一峰大大的博客。

  1. 不能使用setRequestHeader()設置自定義頭部
  2. 兼容IE10+

postMessage

postMessge()是HTML5新定義的通信機制。所有主流瀏覽器都已實現。該API定義在Window對象。

  1. otherWindow.postMessage(message, targetOrigin); 

message: 要傳遞的消息。

targetOrigin: 指定目標窗口的源。在發送消息的時候,如果目標窗口的協議、主機地址或端口這三者的任意一項不匹配targetOrigin提供的值,那么消息就不會被發送;只有三者完全匹配,消息才會被發送。這個機制用來控制消息可以發送到哪些窗口;

當源匹配時,調用postMessage()方法時,目標窗口的Window對象會觸發一個message事件。在進行監聽事件時,應先判斷origin屬性,忽略來自未知源的消息。 

  1. //<http://example.com:8080>上的腳本: 
  2. var popup = window.open(...popup details...); 
  3. popup.postMessage("The user is 'bob' and the password is 'secret'"
  4.               "https://secure.example.net");   
  5. popup.postMessage("hello there!""http://example.org"); 
  6.  
  7. function receiveMessage(event) 
  8.   if (event.origin !== "http://example.org"
  9.     return
  10.   // event.source is popup 
  11.   // event.data is "hi there yourself!  the secret response is: rheeeeet!"【見下面一段代碼可知】 
  12. window.addEventListener("message", receiveMessage, false);  

針對上面的腳本進行接受數據的操作: 

  1. /* 
  2.  * popup的腳本,運行在<http://example.org>: 
  3.  */ 
  4.  
  5. //當postMessage后觸發的監聽事件 
  6. function receiveMessage(event) 
  7.   //先判斷源 
  8.   if (event.origin !== "http://example.com:8080"
  9.     return
  10.  
  11.   // event.source:window.opener 
  12.   // event.data:"hello there!" 
  13.  
  14.   event.source.postMessage("hi there yourself!  the secret response " + 
  15.                            "is: rheeeeet!"
  16.                            event.origin); 
  17.  
  18. window.addEventListener("message", receiveMessage, false);  

后續

收到了很多小伙伴的建議和指正,不勝感激,我會慢慢豐富這篇文章的內容的。請多多指教~

參考文章

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2022-01-04 10:10:34

Garuda LinuArch LinuxLinux

2019-03-13 14:15:25

CORS跨域資源前端

2021-10-25 14:55:38

Linux技巧命令

2013-01-09 13:55:43

2020-04-29 14:30:35

HTTPHTTPS前端

2011-03-25 15:56:58

2019-06-03 08:04:43

Apache服務器命令

2023-05-04 16:10:13

緩存前端

2013-06-28 14:09:33

PHP庫

2020-10-13 14:15:22

HTTPHTTP請求方法

2021-06-07 12:40:34

Python代碼陷阱

2019-02-24 23:06:00

2015-10-26 09:19:28

PHP經驗

2022-11-04 08:22:14

編譯代碼C語言

2014-09-12 11:35:23

開源

2013-05-20 10:14:42

軟件工具項目工具開發工具

2024-11-28 08:54:19

GolangGo變量

2020-06-02 10:10:46

React前端組件

2015-05-07 10:23:19

Android學習資源

2018-04-02 14:33:58

區塊鏈投資存儲技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: a国产一区二区免费入口 | 99这里只有精品视频 | 日韩成人在线播放 | 国产999精品久久久久久绿帽 | 久久久亚洲一区 | 亚洲成人一区 | 国产九九九九 | 九色av | 欧美国产日韩一区二区三区 | 日韩欧美在线一区二区 | 中文字幕一区二区三区不卡在线 | 日本精品视频在线观看 | 国产精品一区二区三区四区 | 日韩精品一区二区三区视频播放 | 在线观看视频一区二区三区 | 国产精品久久久久久久一区二区 | 日韩精品一区二区三区中文在线 | 天天玩天天操天天干 | 国产精品永久 | 日韩不卡一区二区 | 午夜视频一区二区 | 美女毛片免费看 | 欧产日产国产精品视频 | 成年人的视频免费观看 | 精品熟人一区二区三区四区 | 一区二区三区视频在线观看 | 欧美影院| 精品乱码一区二区三四区 | 精品免费国产视频 | 狠狠av | 午夜精品一区二区三区在线视频 | 日批的视频 | 久久久久国产 | 亚洲精品乱码久久久久久蜜桃 | 精品国产三级 | 久草在线免费资源 | 亚洲一区久久久 | 亚洲在线看 | 欧美一区二区三区久久精品视 | 日韩中文久久 | 天天玩天天操天天干 |