HTML5中Access-Control-Allow-Origin解决跨域问题

跨域【CORS】是一种机制,它使用额外的 HTTP 头来告诉浏览器,在运行一个 origin 【domain】 上的Web应用被准许访问,来自不同源服务器上的指定的资源。当一个资源从与该资源本身,所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。

比如,站点 http://www.zhaonan.net 的某 HTML 页面通过 的 src 请求 http://www.zhaonan.net/image.jpg。网络上的许多页面都会加载来自不同域的CSS样式表,图像和脚本等资源。

出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。 例如,XMLHttpRequest和Fetch API遵循同源策略。 这意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非响应报文包含了正确CORS响应头。

对于是否允许跨域,更详细的说明可以看下:

有了对跨域的基本概念了解后,就可直接进入这篇文章的主题了。
解决方法:

若在接收请求的服务端zhaonan.net/B页面用的是php语言,则在页面中加入:

// 指定可信任的域名来接收响应信息,推荐

<?php header('Access-Control-Allow-Origin:http://A.abc.com'); ?>

或加入

// 使用通配符 * ,表示当前服务端通话任何域名发起请求,不推荐

<?php header('Access-Control-Allow-Origin:*'); ?>

就这样在服务端简单加一句响应头responese headers声明,一个跨域请求就不会被浏览器的同源安全策略所阻止了!

用chrome调试工具Network ajax请求查看面板中可以看到,类似如下截图:cors

需要注意的是:

添加响应头responese headers时,允许跨域请求的域名带不带斜杠/还是有区别的,带斜杠/会报错:
XMLHttpRequest cannot load zhaonan.net/B. The ‘Access-Control-Allow-Origin’ header has a value ‘http://miniwechat.zhaonan.net/’ that is not equal to the supplied origin. Origin '‘http://miniwechat.zhaonan.net/’ is therefore not allowed access.

header(‘Access-Control-Allow-Origin:*’);是html5新增的一项标准功能,因此 IE10以下 版本的浏览器是不支持 的,因此,如果要求兼容IE9或更低版本的ie浏览器,会导致使用此种方式的跨域请求以及传递Cookie的计划夭折,最终还得回归JSONP(目前主流的处理方式是使用JSONP,易于实现,兼容性好,可查的资料也很多。)

跨域解决后,如果还要操作Cookie,还得继续补增响应头:

<?php  header('Access-Control-Allow-Credentials:true'); ?>

需要将 XMLHttpRequest 对象的 withCredentials 属性设置为 true,JQuery1.5.1+ 就开始提供了相应的字段,使用方式如下:

$.ajax({
	url:"'http://miniwechat.zhaonan.net/",
	xhrFields:{
		withCredentials:true
	},
	crossDomain:true
});

哦也~ 收到 Cookie 了。

设置 withCredentials 为 true 的请求中会包含 'miniwechat.zhaonan.net/端的所有Cookie,这些Cookie仍然遵循同源策略,所以,你只能访问其中和 zhaonan.net/B同根域的Cookie,而无法访问其他域的Cookie。

Access-Control-Allow-Origin实则是html5 Cross-Origin Resource Sharing实现的最重要的一点参数配置。
Cross-Origin Resource Sharing,跨域资源共享,简称 CORS,可以作为一种跨域请求以及响应的解决方案。

附:

禁用chrome本地安全策略,不用配服务器环境也能发起ajax请求:
chrome 桌面快捷键 右键属性 在快捷方式标签下的“目标”框中加入 --disable-web-security,重启浏览器即可

猜你喜欢

转载自blog.csdn.net/weixin_45018191/article/details/92764509