面试问到数据交互的时候,常常会问跨域如何处理。大部分人都会回答JSONP,而后面试官紧接着就会问:“JSONP缺点是什么啊?”这个时候坑就来了,若是面试者说它支持GET方式,而后面试官就会追问,那若是POST方式发送请求怎么办?基础扎实一些的面试者会说,使用CORS跨域,不扎实的可能就摇摇头了。php
这还没结束,若是公司比较正规或者很在意技术功底,你面试的又是重要岗位,HR还想砍你的工资,就会再补一刀,CORS跨域有什么问题呢?这时候能回答上来的就没几个了,就算是你答出来兼容性很差,须要IE10+浏览器,对方依然有话说,那兼容性怎么处理呢?应试者就没话了,要么被Pass掉,即使留下来,谈工资的时候就没底气了。html
CORS跨域实在是面试官pass一我的的利器。前端
为何会这样呢?面试
1.遇到CORS请求的状况很少,开发者使用这个场景的不多,大部分都JSONP搞定了。json
2.开发者自身技能不扎实,偷懒心态,日常没有意识和意愿去提高本身的技术水平。segmentfault
3.相关的学习资料少、纯前端小白搭建可测试的环境难度大。跨域
面对这条拦路虎,咱们今天就完全解决掉它,让它再也不是咱们的软肋,而是彰显咱们技术实力的亮点。浏览器
首先,什么是CORS?安全
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。 它容许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。
优缺点服务器
优势:
1.支持POST以及全部HTTP请求 2.安全性相对JSOP更高 3.前端要作的事儿比较少
缺点:
1.不兼容老版本浏览器,如IE9及其如下 2.须要服务端支持 3.使用起来稍微复杂了些
怎么用?
前端部分:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>CORS跨域请求</title> <script> function createCORSRequest(method, url) { var xhr = new XMLHttpRequest(); if ("withCredentials" in xhr) { xhr.open(method, url, true); } else if (typeof XDomainRequest != "undefined") { xhr = new XDomainRequest(); xhr.open(method, url); } else { xhr = null; } return xhr; } window.onload = function () { var oBtn = document.getElementById('btn1'); oBtn.onclick = function () { var xhr = createCORSRequest("get", "http://wpdic.com/cors.php"); if (xhr) { xhr.onload = function () { var json = JSON.parse(xhr.responseText); alert(json.a); }; xhr.onerror = function () { alert('请求失败.'); }; xhr.send(); } }; }; </script> </head> <body> <input type="button" value="获取数据" id="btn1"> </body> </html>
注意点:
1.上面代码兼容IE8,由于用了XDomainRequest
2.其它代码你就当成XMLHttpRequset用,别考虑什么2.0不2.0的
3.若是你想post数据,能够往 xhr.send()里面搞
4.这里不建议你们研究"simple methdod"之类的知识,代码弄懂了会用就行,遇到问题了再查也不晚
后台部分:
<?php header('content-type:application:json;charset=utf8'); header('Access-Control-Allow-Origin:*'); header('Access-Control-Allow-Methods:GET,POST'); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Allow-Headers:x-requested-with,content-type'); $str = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; echo $str; ?>
注意点:
1.Access-Control-Allow-Origin: 表示容许任何域名跨域访问,若是须要指定某域名才容许跨域访问,只需把Access-Control-Allow-Origin:改成Access-Control-Allow-Origin:容许的域名,实际工做也要这么作2.Access-Control-Allow-Methods:GET,POST 规定容许的方法,建议控制严格些,不要随意放开DELETE之类的权限
2.Access-Control-Allow-Credentials
该字段可选。它的值是一个布尔值,表示是否容许发送Cookie。默认状况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie能够包含在请求中,一块儿发给服务器。这个值也只能设为true,若是服务器不要浏览器发送Cookie,删除该字段便可。
最后,面试常考问题:
CORS和JSONP的应用场景区别?
CORS要求浏览器(>IE10)和服务器的同时支持,是跨域的根本解决方法,由浏览器自动完成。优势在于功能更增强大支持各类HTTP Method,缺点是兼容性不如JSONP。