html
同源或者不一样源说的是两个地址之间的关系,不一样源地址之间请求咱们称之为跨域请求。node
http://www.baidu.com:80和ftp://www.baidu.com:80 不一样域,协议不同ajax
http://www.baidu.com:80和http://www.xiaomi.com:80 不一样域,主机名不同express
http://www.baidu.com:80和ftp://www.baidu.com:8080 不一样域,端口号不同json
http://www.baidu.com:80/a.html和ftp://www.baidu.com:80/b.js 同域跨域
为何浏览器要限制跨域请求,其中最主要的缘由就是安全性问题,好比CSRF攻击。可是,既然不安全,为何咱们又要跨域请求呢?为了服务器便于管理和减轻服务器压力,公司会把不一样的资源放在不一样的服务器上,这样就存在不少子域,这时好比A子域的html资源要去访问B子域的图片资源就会出现跨域请求了。(能够注意下京东网站就是个很好的例子)浏览器
ajax请求不一样域会出现跨域请求,无访问权限缓存
//报错CORS header ‘Access-Control-Allow-Origin’ missing $.get("http://locally.uieee.com/categories", {}, function (data, textStatus, jqXHR) { console.log(data) }, );
但平时在HTML页面写的<script>、<link>这些标签的src属性是不受跨域请求限制的。安全
var script = document.createElement('script') script.src = 'http://locally.uieee.com/categories'//返回的是json document.body.appendChild(script)
JSONP的策略就是服务器端能够动态生成JSON文件,把客户端须要的数据放到这个文件中,让客户端经过<script>标签的src属性来请求这个文件,这样,一种解决方案就出来了。服务器
在nodejs的express框架里的public写一个js文件,静态资源都放在这里。
双击打开.html文件可看结果
Access-Control-Allow-Origin
如需容许全部资源均可以访问您
的资源,能够如此设置:
Access-Control-Allow-Origin: *
如需容许https://developer.mozilla.org
访问您的资源,能够设置:
Access-Control-Allow-Origin: https://developer.mozilla.org
Node.js 设置header解决跨域问题
//也可单独于某个请求中设置相应头 app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization"); next(); });
若是服务器未使用“*
”,而是指定了一个域,那么为了向客户端代表服务器的返回会根据Origin
请求头而有所不一样,必须在Vary
响应头中包含Origin
。
Access-Control-Allow-Origin: https://developer.mozilla.org Vary: Origin