跨域问题
老早之前就想了解一下跨域到底是怎么产生的,后面一直没去了解,现在了解一下,顺手记录一下
本文主要是看了慕课课程 ajax跨域完全讲解 写的.
本文结构
- 跨域生成的原因
- 跨域的解决方案
跨域生成的原因
- 浏览器限制(可以理解为浏览器安全机制在作祟,浏览器默认会对跨域做拦截)
- 跨域(其实就是请求域名不同的服务器)
- xhr请求(可以理解为ajax请求,你的网站加载其他网站的图片啥的就没有这个问题)
以上三个条件同时满足,请求才会有问题,所以破坏任何一个条件请求就没有问题
解决思路
思路有三种:
- 破坏条件一(让浏览器访问网页,不用校验这些烂七八糟的),下面的解决方案一
- 破坏条件三(xhr请求),下面的解决方案二
- 破坏条件一(让浏览器通过校验,告知浏览器我这个服务器是允许跨域访问的)响应头加上允许跨域访问的头部,下面的解决方案三、四
- 限制浏览器不做校验
- 破坏条件1
- 浏览器启动的时候加上不校验跨域的参数
- 最简单,但不推荐
- 因为1.用户来说就不安全了2.你不可能要求所有用户启动的时候还加上乱起八糟的参数 - xhr—>jsonp请求
- 破坏条件3
- 服务端同时也需要修改,接受方式也需要修改成jsonp
- 比较简单
- 好处:只针对某个请求,改动小,影响面也小同时也有限
- 限制条件:就是服务端自己能修改 - 跨域(被调用方修改)
- 场景:服务器是自己的,
- 解决方案:那么直接在自己返回的请求加上允许跨域访问的 参数
- eg:java的话可以搜一下,跨域 在拦截器在响应头加上参数 - 跨域(调用方修改)
- 场景:服务方不是自己的,
- 解决方案:那么需要自己启动一个服务,然后再转发到别人那边,请求响应的时候再加上参数返回给浏览器
- 这种方案基于你调用的是其他人的服务,没办法改别人的服务
- 例子:大概思路就是访问自己的nginx服务器,然后转发请求到别人的服务器,然后在响应头加上允许跨域的参数