最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS跨域解決方案之使用CORS實(shí)現(xiàn)跨域

 更新時(shí)間:2016年04月14日 09:39:29   作者:choon  
正常使用AJAX會(huì)需要正??紤]跨域問(wèn)題,所以偉大的程序員們又折騰出了一系列跨域問(wèn)題的解決方案,如JSONP、flash、ifame、xhr2等等。本文給大家介紹JS跨域解決方案之使用CORS實(shí)現(xiàn)跨域,感興趣的朋友參考下吧

引言

       跨域是我在日常面試中經(jīng)常會(huì)問(wèn)到的問(wèn)題,這詞在前端界出現(xiàn)的頻率不低,主要原因還是由于安全限制(同源策略, 即JavaScript或Cookie只能訪問(wèn)同域下的內(nèi)容),因?yàn)槲覀冊(cè)谌粘5捻?xiàng)目開(kāi)發(fā)時(shí)會(huì)不可避免的需要進(jìn)行跨域操作,所以跨域能力也算是前端工程師的基本功之一。

  和大多數(shù)跨域的解決方案一樣,JSONP也是我的選擇,可是某天PM的需求變了,某功能需要改成支持POST,因?yàn)閭鬏數(shù)臄?shù)據(jù)量比較大,GET形式搞不定。所以折騰了下聞名已久的CORS(跨域資源共享,Cross-Origin Resource Sharing),這邊文章也就是折騰期間的小記與總結(jié)。

•CORS能做什么:

正常使用AJAX會(huì)需要正??紤]跨域問(wèn)題,所以偉大的程序員們又折騰出了一系列跨域問(wèn)題的解決方案,如JSONP、flash、ifame、xhr2等等。

• CORS的原理:

CORS定義一種跨域訪問(wèn)的機(jī)制,可以讓AJAX實(shí)現(xiàn)跨域訪問(wèn)。CORS 允許一個(gè)域上的網(wǎng)絡(luò)應(yīng)用向另一個(gè)域提交跨域 AJAX 請(qǐng)求。實(shí)現(xiàn)此功能非常簡(jiǎn)單,只需由服務(wù)器發(fā)送一個(gè)響應(yīng)標(biāo)頭即可。

下面我們步入正題具體詳情如下所示:

跨站HTTP請(qǐng)求(Cross-site HTTP request)是指發(fā)起請(qǐng)求的資源所在域不同于請(qǐng)求指向的資源所在域的HTTP請(qǐng)求。

比如說(shuō),我在Web網(wǎng)站A(www.a.com)中通過(guò)<img>標(biāo)簽引入了B站的資源(www.b.com/images/1.jpg),那么A站會(huì)向B站發(fā)起一個(gè)跨站請(qǐng)求。

這種圖片資源的跨站請(qǐng)求是被允許的,類似的跨站請(qǐng)求還有CSS文件,JavaScript文件等。

但是如果是在腳本中發(fā)起HTTP請(qǐng)求,出于安全考慮,會(huì)被瀏覽器限制。比如,使用 XMLHttpRequest 對(duì)象發(fā)起 HTTP 請(qǐng)求就必須遵守 同源策略。

所謂“同源策略”是指Web應(yīng)用程序只能使用 XMLHttpRequest 對(duì)象向發(fā)起源所在域內(nèi)發(fā)起HTTP請(qǐng)求,這個(gè)請(qǐng)求源和請(qǐng)求對(duì)象必須在一個(gè)域內(nèi)。

舉例來(lái)說(shuō),http://www.a.com,這個(gè)網(wǎng)址的協(xié)議是http,域名是www.a.com,端口默認(rèn)是80。那么以下是它的同源情況:

•http://www.a.com/index.html 同源

•https://www.a.com/a.html 不同源(協(xié)議不同)

•http://service.a.com/testService/test 不同源(域名不同)

•http://www.b.com/index.html 不同源(域名不同)

•http://www.a.com:8080/index.html 不同源(端口不同)

為了開(kāi)發(fā)出更強(qiáng)大,更豐富的Web應(yīng)用,跨域請(qǐng)求是很常見(jiàn)的,那么如何在不舍棄安全的情況下進(jìn)行跨域請(qǐng)求呢?

W3C推薦了一種新的機(jī)制,即跨源資源共享(Cross-Origin Resource Sharing (CORS))。

跨源資源共享(CORS)是通過(guò)客戶端+服務(wù)端協(xié)作聲明的方式來(lái)確保請(qǐng)求安全的。服務(wù)端會(huì)在HTTP請(qǐng)求頭中增加一系列HTTP請(qǐng)求參數(shù)(例如Access-Control-Allow-Origin等),來(lái)限制哪些域的請(qǐng)求和哪些請(qǐng)求類型可以接受,而客戶端在發(fā)起請(qǐng)求時(shí)必須聲明自己的源(Orgin),否則服務(wù)器將不予處理,如果客戶端不作聲明,請(qǐng)求甚至?xí)粸g覽器直接攔截都到不了服務(wù)端。服務(wù)端收到HTTP請(qǐng)求后會(huì)進(jìn)行域的比較,只有同域的請(qǐng)求才會(huì)處理。

一個(gè)使用CORS實(shí)現(xiàn)跨域請(qǐng)求的示例:

客戶端:

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");    
// 聲明請(qǐng)求源
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();
} 

服務(wù)端:

public class Test : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
// 聲明接受所有域的請(qǐng)求
context.Response.AddHeader("Access-Control-Allow-Origin", "*");
context.Response.Write("Hello World");
}
public bool IsReusable
{
get
{
return false;
}
}
}

在Web API中啟用跨域訪問(wèn)

CORS是服務(wù)端和客戶端協(xié)作聲明來(lái)確保請(qǐng)求安全的,因此,如果需要在Web API中啟用CORS也需要進(jìn)行相應(yīng)配置。好在微軟的ASP.NET團(tuán)隊(duì)提供了官方的支持跨域的解決方案,只需要在NuGet中添加即可。

然后在App_Start/WebApiConfig.cs進(jìn)行如下配置即可實(shí)現(xiàn)跨域訪問(wèn):

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API 配置和服務(wù)
// 將 Web API 配置為僅使用不記名令牌身份驗(yàn)證。
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跨域訪問(wèn)
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,所以目前在國(guó)內(nèi)CORS并不是主流的跨域解決方案,但是隨著windows 10的發(fā)布,IE的逐漸衰落,可以預(yù)見(jiàn),在不遠(yuǎn)的將來(lái)CORS將成為跨域的標(biāo)準(zhǔn)解決方案。

以上所述是小編給大家介紹的JS跨域解決方案之使用CORS實(shí)現(xiàn)跨域,希望對(duì)大家有所幫助!

相關(guān)文章

  • webpack中CommonsChunkPlugin詳細(xì)教程(小結(jié))

    webpack中CommonsChunkPlugin詳細(xì)教程(小結(jié))

    本篇文章主要介紹了webpack中CommonsChunkPlugin詳細(xì)教程(小結(jié)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • javascript常用正則表達(dá)式匯總

    javascript常用正則表達(dá)式匯總

    本文給大家總結(jié)了一下常見(jiàn)的javascript檢驗(yàn)各種規(guī)則的代碼,通過(guò)正則表達(dá)式來(lái)實(shí)現(xiàn),都是項(xiàng)目中經(jīng)常需要用到的,有需要的小伙伴可以參考下。
    2015-07-07
  • js+css實(shí)現(xiàn)計(jì)算器功能

    js+css實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了js+css實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JavaScript變量聲明詳解

    JavaScript變量聲明詳解

    本文詳細(xì)向大家介紹了javascript變量聲明,并通過(guò)示例進(jìn)行了具體分析,是篇非常不錯(cuò)的文章,這里推薦給剛?cè)腴T的jser。
    2014-11-11
  • Qt6基于Qml的文件對(duì)話框演示效果

    Qt6基于Qml的文件對(duì)話框演示效果

    這篇文章主要介紹了Qt6基于Qml的文件對(duì)話框演示,包括打開(kāi)單個(gè)文件配置和打開(kāi)多個(gè)文件配置及保存文件配置的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • bootstrap table復(fù)雜操作代碼

    bootstrap table復(fù)雜操作代碼

    這篇文章主要為大家詳細(xì)介紹了bootstrap table復(fù)雜操作代碼,生成外層表格,填充表格內(nèi)容,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • javascript中的糖衣語(yǔ)法Promise對(duì)象詳解

    javascript中的糖衣語(yǔ)法Promise對(duì)象詳解

    這篇文章主要介紹了javascript中的糖衣語(yǔ)法Promise對(duì)象詳解,Promise 對(duì)象代表了未來(lái)將要發(fā)生的事件,用來(lái)傳遞異步操作的消息,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • JS組件福利大放送 推薦12款好用的Bootstrap組件

    JS組件福利大放送 推薦12款好用的Bootstrap組件

    Bootstrap組件福利大放送,這篇文章主要為大家推薦了幾款好用的Bootstrap組件,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 微信小程序?qū)崿F(xiàn)保存圖片到相冊(cè)功能

    微信小程序?qū)崿F(xiàn)保存圖片到相冊(cè)功能

    項(xiàng)目中有個(gè)保存二維碼到相冊(cè)的功能,所以涉及到用戶是否授權(quán)相冊(cè)權(quán)限的問(wèn)題。這篇文章主要介紹了微信小程序?qū)崿F(xiàn)保存圖片到相冊(cè)功能,需要的朋友可以參考下
    2018-11-11
  • javascript如何創(chuàng)建對(duì)象

    javascript如何創(chuàng)建對(duì)象

    這篇文章主要為大家詳細(xì)介紹了javascript創(chuàng)建對(duì)象的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評(píng)論

昌乐县| 衡东县| 禄丰县| 富顺县| 壶关县| 丰镇市| 治县。| 随州市| 虞城县| 湄潭县| 兴山县| 集安市| 镇安县| 龙泉市| 长沙市| 三都| 沅江市| 锡林郭勒盟| 达日县| 中卫市| 绥滨县| 平阳县| 永德县| 原阳县| 繁峙县| 武义县| 逊克县| 老河口市| 安陆市| 贵州省| 托里县| 前郭尔| 东城区| 泗阳县| 综艺| 昌图县| 东明县| 怀集县| 漳浦县| 康定县| 信宜市|