以下介绍都是以web项目为例
什么是跨域?
当一个请求url的协议、域名/ip、端口三者之间任意一个与当前页面url不同即为跨域
跨域问题是如何产生的?
日常我们在浏览器地址栏搜索内容时,首先浏览器发送一个请求,如果是通过ip请求,那就直接访问即可,如果是通过域名访问,首先会在本地host文件中查找是否有与之对应的ip,如果有,将域名替换为ip访问。如果没有,继续去dns服务器查找是否有与之对应的ip,如果有,同样将域名替换为ip访问。如果还是没有,访问失败,显示无法访问此网站。
在开发web项目时,通常的场景是打开项目后,项目的地址栏会显示一个url,如http://Iloveapril:8080/, 点击按钮或其他操作和触发请求,一般为请求后端的接口获取数据会有另一个url,如果两个url协议、域名/ip、端口三者之间任意一个不同就会产生跨域
此时涉及到浏览器是否自动补全url的情况:
- 自动补全 我们假设在代码中调用/api/xx,此时浏览器会自动将地址栏中的http://Iloveapril:8080/ 补全到url中,所以在控制台中看到的请求应该是http://Iloveapril:8080/api/xx ,由于这个请求是通过域名请求(如果是通过ip直接请求即可),所以先去本地host文件中找到对应的ip,如果没有再去dns服务中找与之匹配的ip,如果都没找到,那请求就会报错,如果有对应的ip就访问即可。此时由于是自动补全(浏览器地址栏的地址和请求的地址协议、域名/ip、端口三者相同),所以不会存在跨域问题。1)如果host中配置对应的ip为本机,由于通常前后端分离,后端的服务不会在本机中找到,所以会报错404,此时就需要配置代理,把请求转到后端服务器中(类似访问本地环境)。2)如果host中配置对应的ip为后端服务器ip,那就是直接访问(类似访问线上的环境)
- 不自动补全 我们假设在代码中调用http://houduanyuming/api/xx, 同上,由于这个请求是通过域名请求(如果是通过ip直接请求即可),所以先去本地host文件中找到对应的ip,如果没有再去dns服务中找与之匹配的ip,如果都没找到,那请求就会报错,如果有对应的ip就访问即可。此时浏览器地址栏域名(Iloveapril)对应ip与请求地址域名(houduanyuming)对应ip如果不同,就会出现跨域问题,浏览器会自动通过options请求方式请求接口,(options是一种浏览器级行为,普通的get或者post请求会首先自动发起一次options请求,当options请求成功返回后,真正的ajax请求才会再次发起),如果后端允许,正常发送请求(后端解决跨域问题),如果不允许。此时要前端解决跨域问题,关注如何解决跨域问题
如何解决跨域问题?
前端解决跨域问题
首先本地浏览器和本地服务器不存在跨域问题,服务器和服务器也不存在跨域问题
创建一个前端项目,通常启动后会让你访问localhost:8080或者127.0.0.1:8080,如果请求的后端是http://houduanyuming/api/ 在代码中设置代理后,你还要在host中配置127.0.0.1:houduanyuming。其实首先访问的是本地的服务器http://127.0.0.1/api/ ,本地服务器代理到了后端
当然也可以不设置为127.0.0.1,只要浏览器地址栏对应ip和请求url中对应的ip一致,就不会有跨域的问题。所以通常我们说前端通过配置代理服务器解决跨域问题,其实是在浏览器地址栏ip和请求url中ip一致的前提下设置代理服务器,通过本地服务器将请求转发给后端服务器从而解决的跨域问题。
后端解决跨域问题
后端可以自己解决跨域问题,也可以由前端配合一起解决。如果是后端解决,即是开放接口。具体解决方案需要后端同事来写代码喽,目前本人只涉及前端开发。
以上是最近学习心得,望大家多多指正
更多关于跨域及前后端跨域问题的解决推荐下面文章 mp.weixin.qq.com/s/dynx7wrSI… cloud.tencent.com/developer/a…