开发api时,最常见的问题也是跨域问题。今天给大家分享一下。
什么是跨域问题
什么是同源
所谓的同源,就是三个“同”:
- 同一个协议(如http协议)
- 同一个域名
- 同一个端口(如80端口)
如果两个资源的上面三个元素相同,那么就认为这两个资源是同源的。
浏览器跨域
有些人会有疑问:为什么同一个请求,我用php curl发起则没有跨域问题,在浏览器中就会提示跨域?
这是因为跨域问题是浏览器引发的,当你在浏览器中的A页面发起一个B请求时,对于服务端返回的数据,浏览器会判断当前A页面和你发起B请求是否同源,如果不是,浏览器则认为这是不安全的,因此拦截了你的请求。
所以解决跨域的问题也简单,服务端在返回的数据中添加一个header,告诉浏览器我愿意被这个不同源的家伙访问,浏览器看到有这个header自然就给你放行了。
option
当你的前端web,跨域访问api时,你可能会发现,同一个请求,你代码中明明只调用一次,实际上却请求了两次。
这是为啥?
其实这是浏览器的一次试探行为,因为浏览器知道你要请求的接口跟你页面本身不同源,所以它会发起一次method为option的请求来试探一下是否允许跨域请求。
如果你不知道这个茬,一个请求发起两次很可能会导致你的业务重复执行。
解决方案
以php为例,只需在服务端中添加header告诉浏览器允许跨域请求即可。
header('Access-Control-Allow-Origin: *'); //星号表示允许所有来源跨域请求,生产环境建议配置成你的来源站点的域名header("Access-Control-Allow-Headers: token,hehe,dada,此处增加你的自定义请求头,Origin, X-Requested-With, Content-Type, Accept");header('Access-Control-Allow-Methods: POST,GET,OPTIONS');if (request()->isOptions()) { //浏览器的option试探请求,要exit掉,不然你的业务会被执行两次 exit();}
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。