`
乱蓬头199303
  • 浏览: 80471 次
文章分类
社区版块
存档分类
最新评论

ajax请求总是不成功?浏览器的同源策略和跨域问题详解

阅读更多

摘要: XMLHttpRequest cannot load http://oldwang.com/isdad. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://xiao

场景

码农小明要做一个展示业务数据的大屏给老板看,里面包含了来自自己网站的数据和来自隔壁老王的数据。
那么自己网站的数据提供了 http://xiaoming.com/whoami 这样的数据接口
隔壁老王提供了 http://oldwang.com/isdad 这样的数据接口
单独点开都是没有问题的。但是一使用 js 的 ajax 请求就无法收到来自 oldwang.com 的数据了。
点开浏览器控制台一看,红字标出(Chrome):

这就是遇到了跨域问题

为什么会有这样的问题?

想象一下如果隔壁老王根本不认识你,他的网站自己有各种用户接口、订单接口、文章接口,那么谁都可以把这些接口返回的数据直接放在自己的网站上了,还是实时的。

所以浏览器制定了一个 同源策略 ,限制了从一个源(origin)中的脚本获取来自其他源(origin)中的资源。

什么是同源

如果两个页面拥有相同的协议(protocol: http),端口(port: 80),和主机(host: xiaoming.com),那么这两个页面就属于同一个源(origin)。

解决方案

这里就不讲多年前的iframe、flash等方式了,只讲几个最常用到的方案

A.x.com 和 B.x.com 间的跨域

子域名不同也是会受到跨域限制的。这种问题最简单,只需要将页面声明为更高级的域就可以了。

最经典、高效、浏览器兼容最好的解决方案:JSONP

但是有一个致命的缺点:非常高的跨站脚本攻击风险,所以 DataV 是不支持这种方式的

看到JSONP这个名字很多人以为这是和JSON密切相关的一种用来跨域的黑科技,但实际上从跨域的视角看,跟JSON并没有一毛钱关系,他是利用了浏览器允许跨域加载 js 等资源来获取数据。

因为浏览器支持跨域加载 js 如 <script src="http://aliyun.com/....."></script> ,所以很简单,可以把数据包装成 js 就可以了。

这是数据,通过 script 加载到数据无法“执行”,更无法传给 ajax 的回调函数:

这是js脚本,只要将 callback 与 ajax 的回调函数做关联,就可以讲数据传给回调函数:

这可以看到四点:

一、需要 callback 与 ajax 回调函数绑定;
二、需要数据服务器 配合 的。
三、只支持GET请求
四、数据服务器可以随意插入危险的脚本

前端如果用 jquery,jquery已经完成了整个取值过程的封装,逻辑是:
1. 随机生成不重复的 callback 函数名,并与 ajax 回调函数 绑定。
1. 将 callback 函数名放入 URL 的 query string 中,如http://oldwang.com/api?callback= jQuery214015557975923291245_1460532274390
1. 生成一个 <script> 标签,将上述 URL 作为 src
1. 等待数据加载,并把数据传入 ajax 的回调函数

后端以 php 为例,逻辑是获取浏览器传来一个参数作为callback包装数据:

大部分新浏览器都兼容的 CORS(Cross Origin Resource Sharing)

他的原理是隔壁老王主动告诉浏览器“别拦着小明,我们是亲戚……”
所以最简单的例子,就是在数据服务器返回的头信息中包含:

然而这个头信息并不支持枚举,那如果隔壁老王的亲戚太多就只能通过程序来动态得生成这个头信息了,以PHP为例:

如果老王作为一个好人,来者不拒。那么可以直接使用 *

Cookies

CORS默认是不带 cookie 信息的,如果要带上 cookie 需要添加 withCredentials 参数,以 jquery 为例:

而服务器还需要加上允许 Credentials 的头信息以及不允许用通配符“*”,如下面的代码

这就是隔壁老王的故事

​​​​​​​

原文链接

分享到:
评论

相关推荐

    跨域问题详解

    在执行跨域请求时,浏览器会首先根据同源策略判断请求是否为跨域请求。如果检测到请求是跨域的,那么在正式发送请求之前,浏览器会先发送一个预检请求(Preflight request),通常是`OPTIONS`方法的HTTP请求。这个...

    Ajax跨域问题及其解决方案.docx

    **跨域问题的根本原因**在于浏览器的安全策略——同源策略。同源策略是浏览器的一项重要的安全机制,它的目的是为了防止恶意脚本对用户数据进行非法访问或篡改。简单来说,同源策略规定,来自不同源的文档或脚本只能...

    Ajax跨域详解与代码

    **Ajax跨域详解** 在Web开发中,Ajax(Asynchronous JavaScript and XML)技术允许我们实现页面的异步更新,无需刷新整个页面即可获取并展示新数据。然而,由于浏览器的安全策略,同一源策略(Same-Origin Policy)...

    ajax跨域请求

    ### AJAX跨域请求详解 #### 一、引言 在Web开发中,由于浏览器的同源策略限制,AJAX请求通常只能向同源服务器发送请求。然而,在实际应用中,跨域请求的需求非常常见。本篇文章将通过一个具体的示例(JSP页面+后台...

    详解Spring Boot 2.0.2+Ajax解决跨域请求的问题

    "详解Spring Boot 2.0.2+Ajax解决跨域请求的问题" 知识点1:什么是跨域请求? 跨域请求是指浏览器从一个域名下的网页去请求另一个域名下的资源时,会出现的安全限制问题。该限制是因为浏览器的同源策略(Same-...

    Ajax跨域问题详细解读

    然而,随着跨域安全策略的实施,Ajax请求并非总能畅通无阻,这就是所谓的Ajax跨域问题。本文将深入探讨Ajax跨域问题的原理、解决方案以及相关的HTTP头部设置。 1. 跨域限制的由来 浏览器出于安全性考虑,执行同源...

    完美解决iframe跨域问题

    2. **同源策略**:同源策略是浏览器为了安全而实施的一种策略,规定了只有同源(协议+域名+端口完全相同)的网页才能互相访问对方的DOM元素和JavaScript对象,不同源的页面则受到限制。 3. **iframe跨域问题**:当...

    ajax跨域问题!

    ### AJAX跨域问题详解 #### 一、引言 在Web开发中,由于浏览器的安全策略限制,同源策略(Same-origin policy)对于不同来源的数据访问进行了严格的限制,从而导致了跨域问题的发生。本篇文章将深入探讨AJAX跨域...

    ajax跨域问题的解决办法.rar

    然而,由于浏览器的同源策略限制,Ajax请求通常只能在同一个协议、域名和端口下进行,这被称为“跨域”问题。本教程将详细探讨如何解决Ajax跨域问题。 一、同源策略 同源策略是浏览器为了保障用户安全而实施的一种...

    cors技术解决ajax跨域

    在Web开发中,由于浏览器的同源策略限制,AJAX请求只能向同一源(协议+域名+端口)发送,这在跨域请求时会遇到障碍。为了解决这个问题,CORS(Cross-Origin Resource Sharing,跨源资源共享)应运而生。CORS提供了一...

    Ajax异步(请求)提交类 支持跨域

    然而,Ajax默认是不允许跨域请求的,这是出于浏览器的安全策略考虑。为了解决这一限制,开发者们开发了一系列的解决方案,其中就包括本文介绍的支持跨域的Ajax异步请求类。 #### 关键知识点详解 ##### 1. Ajax基础...

    ajax跨域上传文件.zip

    然而,由于浏览器的同源策略限制,Ajax请求通常只能向同一域名下的服务器发送。当我们需要跨域(即向其他域名的服务器发送请求)时,就需要采用特殊的技术手段来实现。 跨域文件上传是Ajax应用的一个常见场景,尤其...

    ajax跨越请求

    总结,Ajax跨域请求涉及浏览器的同源策略、CORS、JSONP、POSTMessage等多个知识点,理解并熟练运用这些技术是现代Web开发中的必备技能。在确保安全性的前提下,合理地利用跨域机制可以极大地提升用户体验和应用性能...

    ajax跨域jar包.zip

    【标题】:“Ajax跨域问题解决方法——CORS详解及jar包使用” 【内容】: 在Web开发中,Ajax(Asynchronous JavaScript and XML)技术被广泛用于实现页面的异步更新,提高用户体验。然而,由于浏览器的安全策略,...

    ajax jsonp 跨域处理

    Ajax JSONP跨域处理是Web开发中的重要技术,通过JSONP,开发者可以在不违反同源策略的前提下实现跨域数据交互。虽然JSONP存在一些限制和安全隐患,但在许多场景下,它仍然是一个实用且有效的解决方案。随着技术的...

    解决JQurey跨域问题$.get|$.post|$.getJSON等等统统可跨域

    在Web开发中,由于浏览器的同源策略限制,JavaScript无法直接访问不同源的资源,这在使用jQuery进行AJAX操作时会遇到问题。本篇将详细介绍如何解决jQuery跨域问题,涉及的方法包括$.get、$.post和$.getJSON等。 ...

Global site tag (gtag.js) - Google Analytics