什麼是跨域
域: 是指瀏覽器不能執行其他網站的指令碼
跨域: 它是由瀏覽器的 同源策略 造成的 , 是瀏覽器對 JavaScript 實施的安全限制,所謂同源(即指在同一個域)就是兩個頁面具有相同的協議 protocol ,主機 host 和埠號 port 則就會造成 跨域
跨域場景
場景的跨域場景有哪些,請參考下表
當前url 請求url 是否跨域 原因
/api.php 否 協議/ 域名 / 埠都相同
是 協議不同
是 主域名不同
是 子域名不同
:80 :8080 是 埠不同
� 解決跨域的四種方式
nginx 的反向代理
使用 nginx 反向代理實現跨域,是最簡單的跨域方式
只需要修改 nginx 的配置即可解決跨域問題,支援所有瀏覽器,支援 session ,不需要修改任何程式碼,並且不會影響伺服器效能
// nginx配置 server { listen 81; server_name location / { proxy_pass 反向代理 proxy_cookie_domain www.domain2.com #修改cookie裡域名 index index.html index.htm; # 當用webpack-dev-server等中介軟體代理介面訪問nignx時,此時無瀏覽器參與,故沒有同源限制,下面的跨域配置可不啟用 add_header Access-Control-Allow-Origin http:// #當前端只跨域不帶cookie時,可為* add_header Access-Control-Allow-Credentials true; } }
jsonp 請求
jsonp 是伺服器與客戶端跨源通訊的常用方法。最大特點就是簡單適用,相容性好 相容低版本 IE ,缺點是隻支援 get 請求,不支援 post 請求
原理時網頁透過新增一個 <script> 元素,向伺服器請求 json 資料,伺服器收到請求後,將資料放在一個指定名字的回撥函式的引數位置傳回來
//jquery實現 <script> $.getJSON('(res) { // 處理獲得的資料 console.log(res) }); </script>
後端語言代理
可以透過一種沒有跨域限制的語言中轉一下,透過後端語言去請求資源,然後再返回資料
比如 需要呼叫 /userinfo 去獲取使用者資料,因為子域名不同,會有跨域限制
可以先請求 下的 php 檔案,比如 /api.php ,然後再透過該 php 檔案返回資料
// api.php 檔案中的程式碼 public function getCurl($url, $timeout = 5) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); $result = curl_exec($ch); curl_close($ch); return $result; } $result = getCurl('/userinfo'); return $result;
後端語言的設定
主要透過後端語言主動設定跨域請求,這裡以 php 作為案例
// 允許所有域名訪問 header('Access-Control-Allow-Origin: *'); // 允許單個域名訪問 header('Access-Control-Allow-Origin: ); // 允許多個自定義域名訪問 static public $originarr = [ ', ' ' ]; // 獲取當前跨域域名 $origin = isset($_SERVER['HTTP_ORIGIN']) ? $_SERVER['HTTP_ORIGIN'] : ''; if (in_array($origin, self::$originarr)) { // 允許 $originarr 陣列內的 域名跨域訪問 header('Access-Control-Allow-Origin:' . $origin); // 響應型別 header('Access-Control-Allow-Methods:POST,GET'); // 帶 cookie 的跨域訪問 header('Access-Control-Allow-Credentials: true'); // 響應頭設定 header('Access-Control-Allow-Headers:x-requested-with,Content-Type,X-CSRF-Token'); }
推薦使用 3A 伺服器,搭建環境槓槓的
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70022313/viewspace-2916612/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 跨域是什麼?跨域請求資源有哪些方法?跨域
- 什麼是跨域,後端工程師如何處理跨域跨域後端工程師
- 一文搞懂│什麼是跨域?如何解決跨域?跨域
- 跨域資源共享(CORS)是什麼?跨域CORS
- 跨域訪問是什麼!怎麼解決?跨域
- 介紹什麼是同源和什麼是跨域,以及三種解決跨域問題的路徑跨域
- 什麼是跨域?解決方案有哪些?跨域
- 24.什麼是跨域?解決方案有哪些?跨域
- 什麼是瀏覽器跨域訪問操作?JS如何實現?瀏覽器跨域JS
- 什麼是領域? - nick
- 什麼是光時域反射儀,OTDR的工作原理是什麼反射
- Python中的作用域是什麼Python
- 跨域問題(普通跨域和springsecurity跨域)跨域SpringGse
- 為什麼出現OPTIONS?SpringBoot介面跨域解決方案Spring Boot跨域
- 說說webpack proxy工作原理?為什麼能解決跨域?Web跨域
- 10.13面試:什麼是跨域?如何解決跨域問題+springMVC如何處理檔案上傳和下載+ssm整合思路 (待完善)面試跨域SpringMVCSSM
- Java是如何實現跨平臺的?原理是什麼?Java
- Python是什麼?哪些領域會用到?Python
- 什麼是Python?Python涉及哪些領域?Python
- 聯盟鏈跨鏈方案Poly Enterprise是什麼?
- 什麼是人工智慧領域的 GAN人工智慧
- 在python中什麼是私有變數域Python變數
- 領域模型的核心本質是什麼?模型
- 跨域跨域
- 跨域就這麼點事兒跨域
- 什麼是人工智慧領域的 Foundation Model?人工智慧
- 什麼是領域驅動設計(DDD)?- mathias
- Tomcat跨域Tomcat跨域
- 跨域CORS跨域CORS
- 前端跨域前端跨域
- nuxt跨域UX跨域
- [SpringBoot] 跨域Spring Boot跨域
- HTTP跨域HTTP跨域
- Vue跨域Vue跨域
- django 跨域Django跨域
- CORS跨域CORS跨域
- 別慌,不就是跨域麼!(轉)跨域
- 前端怎麼解決跨域問題前端跨域