有个关于跨域的困惑
发布于 8 年前 作者 ReakingAd 4019 次浏览 来自 问答

在写服务器的响应时,突然意识到,码农写的代码并没有对请求是否跨域做甄别,统统给出响应。那是不是说浏览器其实是拿到了响应的,但是出于安全考虑,解析完response,又没看到’Access-Control-Origin-Allow’字段,就把数据藏起来不给js脚本看,转而在console报了个错? 查了点文档: w3c的cors规范里说,user agent对响应信息做一系列判断,例如Access-Control-Origin-Allow,跨域的请求会被至于network error状态。network error状态的处理方式是:

Handle analogous to requests where some kind of error occurred. Ensure not the reveal any further information about the request.

MDN上关于跨域是这么说的:

正如大家所知,出于安全考虑,浏览器会限制脚本中发起的跨域请求。比如,使用 XMLHttpRequest 对象和Fetch发起 HTTP 请求就必须遵守同源策略。 具体而言,Web 应用程序通过 XMLHttpRequest 对象或Fetch能且只能向同域名的资源发起 HTTP 请求,而不能向任何其它域名发起请求。为了能开发出更强大、更丰富、更安全的Web应用程序,开发人员渴望着在不丢失安全的前提下,Web 应用技术能越来越强大、越来越丰富。比如,可以使用 XMLHttpRequest 发起跨站 HTTP 请求。(这段描述跨域不准确,跨域并非浏览器限制了发起跨站请求,而是跨站请求可以正常发起,但是返回结果被浏览器拦截了。最好的例子是CSRF跨站攻击原理,请求是发送到了后端服务器无论是否跨域!注意:有些浏览器不允许从HTTPS的域跨域访问HTTP,比如Chrome和Firefox,这些浏览器在请求还未发出的时候就会拦截请求,这是一个特例。)

3 回复

根据实测,浏览器会发出一个options的请求

@zsea 我看文档里说,请求有3种:

  1. 简单请求
  2. 预请求
  3. 带验证信息的请求

第二种预请求会先发送一个options请求,确定是否可以跨站共享。你测试时候是使用的什么请求呢?在我看来,平时写的ajax都是简单请求。

预请求定义:

请求以 GET, HEAD 或者 POST 以外的方法发起请求。或者,使用 POST,但请求数据为 application/x-www-form-urlencoded, multipart/form-data 或者 text/plain 以外的数据类型。比如说,用 POST 发送数据类型为 application/xml 或者 text/xml 的 XML 数据的请求。 使用自定义请求头(比如添加诸如 X-PINGOTHER)

简单请求定义:

只使用 GET, HEAD 或者 POST 请求方法。如果使用 POST 向服务器端传送数据,则数据类型(Content-Type)只能是 application/x-www-form-urlencoded, multipart/form-data 或 text/plain中的一种。 不会使用自定义请求头(类似于 X-Modified 这种)。

@ReakingAd fetch发送的post

回到顶部