跨域AJAX解决方案

由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性。

同源策略的判定规则:

如果两个页面拥有相同的协议,端口,和主机,那么这两个页面就属于同一个源;

图示例:


同源策略判定.png

特别的:由于同源策略是浏览器的限制,所以请求的发送和响应是可以进行,只不过浏览器不接受罢了。

浏览器同源策略并不是对所有的请求均制约:

  1. 制约: XmlHttpRequest
  2. 无效: img、iframe、script等具有src属性的标签

两种实现跨域请求的方式,JSONP和CORS

对比:
Jsonp只支持 GET 请求,CORS支持所有类型的HTTP请求。
Jsonp 的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。

(1) JSON-P实现跨域请求

利用script标签的src属性(浏览器允许script标签跨域)。

基本原理:

  1. 浏览器创建script标签,并利用script标签的src属性发送跨域请求,获取服务器的返回值在<script>标签内。
  2. 服务器返回函数调用语句(myfunc(args);),并将需要返回的值(args)作为函数参数一并返回。
  3. 浏览器执行服务器返回的调用函数的语句(myfunc(args)),对返回值进行操作。
  4. 浏览器删除第一步创建的script标签。

代码实例:

<p>
    <input type="button" onclick="getJsonp();"  value='提交'/>
</p>

JS实现:

//创建script标签跨域请求

function getJsonp(){
        var tag = document.createElement('script');
        tag.src = "http://tkq2.com:8000/test";
        document.head.appendChild(tag);
        document.head.removeChild(tag);
}

//根据返回函数myfunc([1,2,3]);执行定义的myfunc函数
function  myfunc(list) {
    console.log(list);
}

Jquery实现:
//创建script标签跨域请求

function getJsonp(){
    $.ajax({
       url: "http://tkq2.com:8000/test",
       dataType: 'jsonp',
       jsonpCallback: 'myfunc'  
    })
}

其中jsonpCallback,自定义了回调函数名,默认为jQuery自动生成的随机函数名。如果不写回调函数名,默认执行与服务器返回的函数名相同的函数。

//根据返回函数myfunc([1,2,3]);执行定义的myfunc函数

function  myfunc(list) {
    console.log(list);
}

以上两种写法中,回调函数被服务端写死了,请求端必须定义和服务器端相同函数名才行。但作为服务端应该有更好的兼容性,请求端自行决定回调函数名字。

JS实现:
//创建script标签跨域请求,并根据返回函数myfunc([1,2,3]);执行定义的myfunc函数

function GetJsonp(){
    var tag = document.createElement('script');
    //自定义回调函数名,jsonpcallback=myfunc字段供服务端读取。
    tag.src = "http://tkq2.com:8000/test?jsonpcallback=myfunc";
    document.head.appendChild(tag);
    document.head.removeChild(tag);
}

function  myfunc(list) {
    console.log(list);
}

Jquery实现

//创建script标签跨域请求,并根据返回函数myfunc([1,2,3]);执行定义的myfunc函数

function GetJsonp(){
    $.ajax({
        url: "http://tkq2.com:8000/test",
        dataType: 'jsonp',
        jsonp:'jsonpcallback',   //传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
        jsonpCallback:'myfunc'  //自定义了回调函数名,默认为jQuery自动生成的随机函数名。如果不写回调函数名,默认执行与服务器返回的函数名相同的函数。
    })
}

//回调函数

function  myfunc(list) {
    console.log(list);
}

(2) CORS跨域资源共享

随着技术的发展,现在的浏览器可以支持主动设置从而允许跨域请求,即:跨域资源共享(CORS,Cross-Origin Resource Sharing),其本质是设置响应头,使得浏览器允许跨域请求。

这种实现方式:请求端和普通的AJAX方法相同,但服务器端需要做相应的配置。

跨域传输cookie:
在跨域请求中,默认情况下,HTTP Authentication信息,Cookie头以及用户的SSL证书无论在预检请求中或是在实际请求都是不会被发送。

如果想要发送:

浏览器端:XMLHttpRequest的 withCredentials 为 true (如果后台需要传cookie,则设置,否则,不用设置)
服务器端:Access-Control-Allow-Credentials 为 true

$.ajax({
    url: ajaxUrlConfig.getAddOrder,
    data: data,
    type: 'POST',
    xhrFields: {
        withCredentials: true
    },                
    dataType: 'json',
    timeout: 300000
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341