在写服务器的响应时,突然意识到,码农写的代码并没有对请求是否跨域做甄别,统统给出响应。那是不是说浏览器其实是拿到了响应的,但是出于安全考虑,解析完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,这些浏览器在请求还未发出的时候就会拦截请求,这是一个特例。)