1. 程式人生 > >跨域解決方案一:使用CORS實現跨域

跨域解決方案一:使用CORS實現跨域

跨站HTTP請求(Cross-site HTTP request)是指發起請求的資源所在域不同於請求指向的資源所在域的HTTP請求。

比如說,我在Web網站A(www.a.com)中通過<img>標籤引入了B站的資源(www.b.com/images/1.jpg),那麼A站會向B站發起一個跨站請求。

這種圖片資源的跨站請求是被允許的,類似的跨站請求還有CSS檔案,JavaScript檔案等。

但是如果是在指令碼中發起HTTP請求,出於安全考慮,會被瀏覽器限制。比如,使用 XMLHttpRequest 物件發起 HTTP 請求就必須遵守 同源策略

所謂“同源策略”是指Web應用程式只能使用 

XMLHttpRequest 物件向發起源所在域內發起HTTP請求,這個請求源和請求物件必須在一個域內。

舉例來說,http://www.a.com,這個網址的協議是http,域名是www.a.com,埠預設是80。那麼以下是它的同源情況:

  • http://www.a.com/index.html 同源
  • https://www.a.com/a.html 不同源(協議不同)
  • http://service.a.com/testService/test 不同源(域名不同)
  • http://www.b.com/index.html 不同源(域名不同)
  • http://www.a.com:8080/index.html 不同源(埠不同)

為了開發出更強大,更豐富的Web應用,跨域請求是很常見的,那麼如何在不捨棄安全的情況下進行跨域請求呢?

跨源資源共享(CORS)是通過客戶端+服務端協作宣告的方式來確保請求安全的。服務端會在HTTP請求頭中增加一系列HTTP請求引數(例如Access-Control-Allow-Origin等),來限制哪些域的請求和哪些請求型別可以接受,而客戶端在發起請求時必須宣告自己的源(Orgin),否則伺服器將不予處理,如果客戶端不作宣告,請求甚至會被瀏覽器直接攔截都到不了服務端。服務端收到HTTP請求後會進行域的比較,只有同域的請求才會處理。

一個使用CORS實現跨域請求的示例:

客戶端:

        function getHello() {
            var xhr = new XMLHttpRequest();
            xhr.open("post", "http://b.example.com/Test.ashx", true);
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");    
            // 宣告請求源
            xhr.setRequestHeader("Origin", "http://a.example.com");
            xhr.onreadystatechange = function () {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    var responseText = xhr.responseText;
                    console.info(responseText);
                }
            }
            xhr.send();
        }

服務端:

 public class Test : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            // 宣告接受所有域的請求
            context.Response.AddHeader("Access-Control-Allow-Origin", "*");
            context.Response.Write("Hello World");
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

在Web API中啟用跨域訪問

CORS是服務端和客戶端協作宣告來確保請求安全的,因此,如果需要在Web API中啟用CORS也需要進行相應配置。好在微軟的ASP.NET團隊提供了官方的支援跨域的解決方案,只需要在NuGet中新增即可。

然後在App_Start/WebApiConfig.cs進行如下配置即可實現跨域訪問:

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服務
            // 將 Web API 配置為僅使用不記名令牌身份驗證。
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API 路由
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            // 允許Web API跨域訪問
            EnableCrossSiteRequests(config);

            config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        }

        private static void EnableCrossSiteRequests(HttpConfiguration config) {
            var cors = new EnableCorsAttribute(
              origins: "*",
              headers: "*",
              methods: "*"
              );
            config.EnableCors(cors);
        }
    }

由於IE10以下瀏覽器不支援CORS,所以目前在國內CORS並不是主流的跨域解決方案,但是隨著windows 10的釋出,IE的逐漸衰落,可以預見,在不遠的將來CORS將成為跨域的標準解決方案之一。

參考資料:

JavaScript中的跨域解決方案彙總:

相關推薦

解決方案使用CORS實現

跨站HTTP請求(Cross-site HTTP request)是指發起請求的資源所在域不同於請求指向的資源所在域的HTTP請求。 比如說,我在Web網站A(www.a.com)中通過<img>標籤引入了B站的資源(www.b.com/images/1.jpg),那麼A站會向B站發起一個跨站請

解決方案JSONP

同源策略 巴拉巴拉巴拉….(定義就不講了,簡單來說就是協議、埠、域名要相同) 注意:協議和埠引起的不同,不在前端解決的範圍內 JSONP jsonp的原理很簡單,就是動態的創造script標籤,然後利用script的src 不受同源策略約

解決方案使用JSONP實現

跨域的實現方式有多種,除了 上篇文章 提到的CORS外,常見的還有JSONP、HTML5、Flash、iframe、xhr2等。 這篇文章對JSONP的跨域原理進行了探索,並將我的心得記錄在這裡和大家分享。 JSONP跨域原理探祕 我們知道,使用 XMLHTTPRequest 物件傳送HTTP請求時,會

實戰案例構建docker容器集群 (解決方案使用自定義網橋連接主機容器)

docker一、實驗環境虛擬機a兩塊網卡 eth0 eth1 (IP地址static或者dhcp)虛擬機b兩塊網卡 eth0 eth1 (IP地址static或者dhcp)二、在兩臺虛擬機上配置網橋虛擬機a操作:apt-get install bridge-utilsvim /etc/ne

開源解決方案快速搭建單機版 LAMP 網站

opera clas 資源管理 都在 ger source environ 本地 tin LAMP 通常表示 Linux + Apache + MySQL/MariaDB + Perl/PHP/Python,LAMP 的各個組件不是一成不變的,並不局限於它最初的選擇。作為一

大資料下載防止系統崩潰解決方案阻塞集中式下載

/**  * 下載控制器  * 阻塞集中式下載 防止系統崩潰  * 使用定時過期的快取鎖實現  * 每10分鐘只能下載一次  **/ import com.google.common.cache.Cache; import com.google.common

【PHP】Ajax解決方案 、jsonp、cors

code col 服務器 實現 官方 跨域傳輸 ref 響應 非官方 參考文章: 1、https://blog.csdn.net/u014727260/article/details/72793459 (後臺java,實際上差不多) 2、 如何解決ajax跨域傳輸 數據的問

解決方案CORS簡介

現在請跟我做:在您的瀏覽器的位址列中輸入www.yhd.com並敲擊回車。在網站內容全部載入完畢後,按F12開啟瀏覽器的除錯視窗。當切換到Sources頁時,您會發現您當前所看到的一號店的頁面是從多個不同的域中得到的:   或許有些讀者會感到奇怪:在之前自己 寫網頁的時

CORS ———— 解決方案之二

其他跨域方案請看: 以下介紹CORS跨域解決方案 一、什麼是CORS? CORS (Corss-Orign Resource Sharing) 是W3C工作草案,是一份瀏覽器技術的規範。定義了跨域資源訪問時,瀏覽器和伺服器之間如何通訊,使用自定義的http頭部允

ASP.NET中JSONP的兩種實現以及其他解決方案的簡單實現 ASP.NET中JSONP的兩種實現以及其他解決方案的簡單實現

ASP.NET中JSONP的兩種實現以及其他跨域解決方案的簡單實現    jQuery中JSONP的兩種實現方式:    都很簡單,所以直接上程式碼!    前臺程式碼如下: &l

瀏覽器的同源策略及CORS解決方案 DRF

一個源的定義 如果兩個頁面的協議,埠(如果有指定)和域名都相同,則兩個頁面具有相同的源。 舉個例子: 下表給出了相對http://a.xyz.com/dir/page.html同源檢測的示例:  URL 結果 原因 http://a.x

JSON解決方案收集

get ogl obb 本地 allow con mesa 跨域請求 loader 最近面試問的挺多的一個問題,就是JavaScript的跨域問題。在這裏,對跨域的一些方法做個總結。由於瀏覽器的同源策略,不同域名、不同端口、不同協議都會構成跨域;但在實際的業務中,很多

前端如何去做解決方案

時也 for 前後端 define 影響 list nts 告訴 iframe 前言 那些你,你常用的跨域解決方案除了jsonp 之外,還有其他的嗎?今日早讀文章可以告訴你,本文由 金蝶 @scq000授權分享。 正文從這開始~ 瀏覽器在請求不同域的資源時,會因為同源策略的

前端常見解決方案(全)

-type crm api war str bsp 斷開 jquery 數據塊 什麽是跨域? 跨域是指一個域下的文檔或腳本試圖去請求另一個域下的資源,這裏跨域是廣義的。 廣義的跨域: 1.) 資源跳轉: A鏈接、重定向、表單提交 2.) 資源嵌入: <link

前端常見解決方案

自定義 兩個 ech cors onload 消息 strong put 普通 什麽是跨域? 跨域是指一個域下的文檔或腳本試圖去請求另一個域下的資源,這裏跨域是廣義的。 廣義的跨域: 1.) 資源跳轉: A鏈接、重定向、表單提交 2.) 資源嵌入:<lin

[轉] 利用CORS實現請求

src 流程圖 exp 否則 expose 前端 eof 目前 star [From] http://newhtml.net/using-cors/ 跨域請求一直是網頁編程中的一個難題,在過去,絕大多數人都傾向於使用JSONP來解決這一問題。不過現在,我們可以考慮一下

spring mvc的解決方案

增加 是否 strac inf oss ref nds sso option 什麽是跨域 一句話:同一個ip、同一個網絡協議、同一個端口,三者都滿足就是同一個域,否則就是跨域。 為什麽非得跨域 基於兩個方面: a. web應用本身是部署在不同的服務器上 b.基於開發的角度

前端常見的解決方案

params 分離 true local img 原生 AI spa 共享 什麽是跨域: 一個域名下的文檔或者腳本試圖請求另外一個域名的下的資源 廣義的跨域: 資源跳轉:a鏈接、重定向、表單提交 資源嵌入:<link> <script> &

同源策略、解決方案

color 動態 一個 cati req 回調函數 IV 解決方案 參數傳遞 一、定義 1、什麽是源? 源(origin)就是協議、域名和端口號。以上url中的源就是:http://www.company.com:80若地址裏面的協議、域名和端口號均相同則屬於同源。以下是相

ajax 解決方案

AC head -a PE web cto options 方案 col 第一步:配置Php 後臺允許跨域 <?php header(‘Access-Control-Allow-Origin: *‘); header(‘Access-Control-Allow-He