1.为什么产生跨域问题
跨域问题来源于JavaScript的同源策略
即只有 协议+主机名+端口号(如存在)相同,则允许相互访问
也就是说JavaScript只能访问和操作自己域下的资源,不能访问和操作其他域下的资源
跨域问题是针对JS和ajax的,html本身没有跨域问题,比如a标签、script标签、甚至form标签
2.什么是跨域
通过一个Url去访问另一个Url的过程中,如果他们的
协议、域名、端口
三者之间任意一个存在不同,则为跨域
3.如何解决跨域
1
.
修改浏览器的设置
--disable-web-security--user-data-dir#找到路径下的Chrome.exe通过前面的命令对浏览器进项修改设置
2.修改请求的方式:
J
sonp
$("#Test").click(function(){
$.ajax({
url : 'http://www.xiaozhao.top/Index/Test/crossDomain',
data : {},
type : 'get',
dataType : 'jsonp',
success : function (result) {
alert(result);
}
});
});
缺点: Jsonp只支持GET请求
只支持跨域HTTP请求
可能存在很多其他的限制...
3.CORS
1.什么是CORS
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)
协议:
-
传统的Ajax请求只能获取在同一个域名下面的资源,但是HTML5打破了这个限制,允许Ajax发起跨域的请求。
-
浏览器是可以发起跨域请求的,比如你可以外链一个外域的图片或者脚本。但是Javascript脚本是不能获取这些资源的内容的,它只能被浏览器执行或渲染。
-
在Flash和Silverlight中,服务器需要创建一个crossdomain.xml的文件来允许跨域请求。如果这个文件声明“http://your.site”允许来自“http://my.site”的请求,则来自“http://my.site”的请求可以访问所有“http://your.site”的文件。这是一种整个站点层面上的控制模式,要么你允许一个外域的站点访问,要么拒绝。
-
COR不一样,它是页面层次的控制模式。每一个页面需要返回一个名为‘Access-Control-Allow-Origin’的HTTP头来允许外域的站点访问。你可以仅仅暴露有限的资源和有限的外域站点访问。在COR模式中,访问控制的职责可以放到页面开发者的手中,而不是服务器管理员。当然页面开发者需要写专门的处理代码来允许被外域访问。
另外一个主要的区别是,某个站点的crossdomain.xml文件是最早被浏览器获取并分析的。如果一个外域的站点不允许被访问,浏览器压根就不会发出跨域请求。
COR则相反,Javascript先发出跨域请求,然后检查回复的‘Access-Control-Allow-Origin’头。如果这个头允许该外域访问,则Javascript可以读取这个回复,否则就被禁止访问。如果请求不是一个简单的COR,则向外域服务器发送预检验请求,如果回复的头部允许访问,则发送跨域请求,否则禁止。
COR的实现标准就是CORS协议。
2.要求
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10
3.请求分类
简单请求(simple request)和非简单请求(not-so-simple request)
4.解决
1.修改服务端的代码设置头信息
res.setHeader('Access-Control-Allow-Origin', "*"); //针对哪个域名可以访问,*表示所有
res.setHeader('Access-Control-Allow-Credentials', true); //是否可以携带cookie
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
2.通过@CrossOrigin
3.通过网关配置