什么是同源策略
源就是协议+域名+端口号
同源就是协议,域名,端口号都相同,任何一个不同都是非同源(即跨域),如:http和https就是非同源的
对于非同源的两个网页会有一下问题
-
dom访问受到限制:源A的JavaScript不能访问到源B的dom元素(嵌套)
- 先拿到iframe元素,在iframe.contentWindow.document 拿到document文档
-
cookie访问限制:俩个源不能共享cookie
-
响应数据限制:两个源可以互相发请求,但是响应的东西会被浏览器拦截(Access-Control-Allow-Origin)
ps:跨域问题仅仅存在于浏览器,服务器之间不会有跨域问题,<link>,<script>,<img>等标签的请求也可能会跨域,只不过浏览器不做严格限制,几乎没有影响
跨域
跨域资源共享(全称Cross-Origin Resource Sharing, 简称CORS)是一种安全策略,由浏览器 enforced,限制跨域 HTTP 请求。用于控制浏览器校验跨域请求,服务器可以依照cors,添加特定的响应头来控制浏览器校验大致规则如下:
- 浏览器明确表示拒绝跨域请求,或者没有明确表示,则校验不通过
- 浏览器明确表示允许跨域请求,则校验通过
CORS解决简单的跨域
后端可以设置Access-Control-Allow-Origin响应头字段放行某一些源比如setHeader('Access-Control-Allow-Origin','*')允许所有源访问
简单请求和复杂请求
CORS解决预检请求问题
跨域预检请求是option方法
设置响应头:
Access-Control-Allow-Origin:'...',
Access-Control-Allow-Header:'请求头的自定义字段',
Access-Control-Allow-Method:'请求方法',
Access-Control-Max-Age: 单位秒 // 类似于TTL,接下来多少秒都不用发预检请求了
jsonp 解决跨域问题
过程如下仅支持get请求
!!!浏览器会把响应的内容全部当成是js脚本