跨域指的是浏览器不能执行其他网站的脚本,由浏览器的同源策略造成的,是浏览器的安全机制。
同源策略指的是浏览器的协议,域名,端口必须一致
URL网址的组成:
http://www.baidu.com:80/index.html?username=xxx&password=yyy#hash
协议://域名:端口 / 资源路径?查询字符串#hash
同源策略下发送请求无法实现,会出现以下报错
Access to fetch at ‘xxx’ from origin ‘xxx’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.
解决跨域的方法
1. JSONP跨域【目前已基本不用了】
JSONP
JSON、JSONP的区别:
- JSON返回的是一串数据,JSONP返回的是脚本代码(包含一个函数调用)
- JSONP只支持get请求、不支持post请求(类似往页面添加一个script标签,通过src属性去触发对指定地址的请求,故只能是Get请求)
JSONP应用的技巧:
在HTML标签里,一些标签属性比如sec、href这样的获取资源的标签是没有跨域限制的。
2. CORS跨域
后端修改请求头
header(‘Access-Control-Allow-Origin:*’);允许访问的网址
header(‘Access-Control-Allow-Method:POST,GET’);允许访问的方式
3. nginx反向代理
www.baidu.com/index.html需要调用www.sina.com/server.php,可以写一个接口www.baidu.com/server.php,由这个接口在后端去调用www.sina.com/server.php并拿到返回值,然后再返回给index.html