Ajax的跨域请求数据的问题,一直是前端开发者经常讨论的话题。翻看了很多博客文章,发现很多人认为ajax跨域问题是Ajax本身的一些缺陷导致的,还有人认为这是服务器对Ajax请求的拦截,不过这些认识都是不全面的。其实禁止跨域请求是浏览器本身的一种安全策略——换句话说,其实禁止跨域不是什么ajax缺陷,是浏览器会对JavaScript的跨域请求有一些限制。
一、同源策略简介
同源策略[same origin policy]是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。 同源策略是浏览器安全的基石。
什么是源
源[origin]就是协议、域名和端口号。例如:http://www.baidu.com:80这个URL。
什么是同源
若地址里面的协议、域名和端口号均相同则属于同源。
是否是同源的判断
URL | 说明 | 是否允许通信 |
---|---|---|
http://www.a.com/a.js http://www.a.com/b.js | 同一域名下 | 允许 |
http://www.a.com/lab/a.js http://www.a.com/script/b.js | 同一域名下不同文件夹 | 允许 |
http://www.a.com:8000/a.js http://www.a.com/b.js | 同一域名,不同端口 | 不允许 |
http://www.a.com/a.js https://www.a.com/b.js | 同一域名,不同协议 | 不允许 |
http://www.a.com/a.js http://70.32.92.74/b.js | 域名和域名对应ip | 不允许 |
http://www.a.com/a.js http://script.a.com/b.js | 主域相同,子域不同 | 不允许 |
http://www.a.com/a.js http://a.com/b.js | 同一域名,不同二级域名(同上) | 不允许(cookie这种情况下也不允许访问) |
http://www.cnblogs.com/a.js http://www.a.com/b.js | 不同域名 | 不允许 |
注意:
- 第一,如果是协议和端口造成的跨域问题“前台”是无能为力的,
- 第二:在跨域问题上,域仅仅是通过“URL的首部”来识别而不会去尝试判断相同的ip地址对应着两个域或两个域是否在同一个ip上。
跨域
受前面所讲的浏览器同源策略的影响,不是同源的脚本不能操作其他源下面的对象。想要操作另一个源下的对象就需要跨域。 在同源策略的限制下,非同源的网站之间不能发送 AJAX
请求。
如何跨域
-
降域
可以通过设置
document.damain='a.com'
,浏览器就会认为它们都是同一个源。想要实现以上任意两个页面之间的通信,两个页面必须都设置documen.damain='a.com'
。 -
JSONP
跨域 -
CORS
跨域
二、JSONP简介
待补充
三、CORS 简介
为了解决浏览器同源问题,W3C
提出了跨源资源共享,即 CORS
(Cross-Origin Resource Sharing)。
CORS
做到了如下两点:
- 不破坏即有规则
- 服务器实现了
CORS
接口,就可以跨源通信
基于这两点,CORS
将请求分为两类:简单请求和非简单请求。
参考:简单请求和非简单请求-》https://www.cnblogs.com/yuansc/p/9076604.html
springboot 使用CORS的三种方式(在类或方法上添加注解(部分支持跨域)、新增配置类(全局支持跨域)、过滤器)-》 https://blog.csdn.net/saytime/article/details/74937204