前端跨域问题

跨域在前端开发中是一个很常见的问题,为什么会出现跨域这种情况呢?主要是为了解决安全问题。首先看一下跨域是怎么造成的:

浏览器的同源策略

MDN的解释:同源策略限制从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的关键的安全机制。
浏览器的同源策略限制了不同源之间的html或者js进行互相交互的可能,可以很好的防止有些网站恶意获取其他网站数据,当然也限制了部分页面间的交互功能。

发生跨域的情况

  • 不同域名(包括不同子域名)
  • 不同协议
  • 不同端口号

常见的跨域场景

  • 获取页面内iframe高度
  • 与子页面通信
  • ajax请求

前两个场景出现的情况都比较少,当然也有很多解决方案(如增加一个代理页面,通过document.domain等等)。主要说一下ajax请求的跨域问题,这是一个非常常见的问题。

解决方案:

一、jsonp

JSONP(JSON with Padding)是一种json的使用方式,用来处理跨域问题。Jsonp通过在页面内定义一个方法,同时插入一个script脚本,然后服务端返回数据放入脚本请求url中callback方法,然后页面就可以在之前定义的方法中取到数据。

前端:
<script type="text/javascript">
    function todo(response){
        ...
    }
</script>
<script src="http://www.test.com/datas.php?callback=todo"></script>
服务端:
<?php
    $callback = $_GET['callback'];
    $datas = array('data1','data2');
    echo $callback.'('.json_encode($datas).')';
?>
优点
  • 封装后使用比较方便,无其他属性配置
  • 兼容老版本浏览器
缺点
  • 仅能用于get请求
  • 存在安全性问题
二、CORS

CORS(Cross-origin resource sharing)全称为跨域资源共享。主要可以解决ajax跨域的问题。使用CORS主要配置:

前端
var xhr = new XMLHttpRequest();
xhr.withCredentials = true; //支持跨域传递cookie
服务端
Access-Control-Allow-Origin: http://example.com
Access-Control-Allow-Credentials: true
优点
  • 配置简单,服务端可以全局配置或者单个接口配置
  • 支持所有网络请求类型
缺点
  • 需要传递cookie只能配置一个域名
  • 有兼容性问题,不过大部分浏览器已经支持
参考文章

跨域资源共享 CORS 详解
前端跨域整理
前端跨域及其解决方案
前端跨域问题及解决方案

over…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值