本文详见javascript
node server/server.js 开启服务html
node server/staticServer.js 开启服务前端
跨域是为了保证服务端的安全,不容许随便的请求,这是浏览器的安全行为java
tipsnode
localhost和127.0.0.1不一样域,浏览器并不知道localhost映射到的是127.0.0.1,因此认为他们不一样域
当浏览器出现跨域报错时,==其实服务器的响应已经到达浏览器了==,只不过浏览器会对比请求的头信息,对比当前域是不是被Access-Control-Allow-Origin头信息容许的,若是不容许,则提示报错git
对于link,script,image等标签src或ref是能够拿到非同域的资源,js动态建立script标签则可获取到数据,这个不须要后端支持github
敲黑板:Access-Control-Allow-Origin并不能彻底支持跨域,还有其余限制,好比使用fetch,有些自定义头信息,超出容许范围的方法等,在跨域的时候,都是不被容许的chrome
在如下容许范围以外的,都须要经过预请求的验证&&一些限制后端
容许方法api
容许Content-Type
预请求根据什么来判断这个请求是不是被容许的呢 - Response Headers信息,浏览器读取Response Headers信息来知道当前请求是否是被容许的
对于CORS跨域,限制条件有不少,以下,这些在限制条件以内才能够容许
前端
fetch('http://127.0.0.1:8887', { method: 'POST', // 此处添加一条自定义头信息 headers: { 'X-Test-Cors111': 'test' } })
后端
response.writeHead(200, { 'Access-Control-Allow-Origin': '*', })
此时后端须要以下,容许这种自定义头信息,才能够能够正常返回
response.writeHead(200, { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'X-Test-Cors111' })
同理,还有如下其余的限制
tips:
chrome devTools有时候会不提示options预请求的XHR?发送options预请求的很差验证查看详细的http请求和响应的内容: curl -v www.baidu.com