两种跨域方法

在 Javascript 中跨域访问是比较常见的事情

就像现在比较流行写单页应用,而单页应用在访问 API 的时候就会有跨域的问题

要解决跨域的问题,其实也并不复杂,有两种方案可以选择

Jsonp 跨域

Jsonp 的实现原理就是:创建一个回调函数,然后在远程服务上调用这个函数并且将 JSON 数据形式作为参数传递,完成回调。

CORS(跨域资源共享)

跨源资源共享标准通过新增一系列 HTTP 头,让服务器能声明哪些来源可以通过浏览器访问该服务器上的资源。

对于 GET 以外的 HTTP 方法,或者搭配某些 MIME 类型的 POST 请求,如:PUT 或者 DELETE 等,

以及如果自定义了请求头的话,浏览器必须先以 OPTIONS 请求方式发送一个预请求 (Preflight Request),

从而获知服务器端对跨域请求所支持的 HTTP 方法,确认了服务器端允许该跨域请求的情况下,以实际的 HTTP 请求方法发送真正的请求。

跨域方法的选择

Jsonp 跨域方式,兼容性更好,如果需要兼容旧浏览器的话,可以考虑使用,但是这种方法不支持自定义请求头 (Request Headers)

不过,对于访问 API ,通常都是需要验证 Token 的,而 Token 都是需要放到请求头上的

所以对于正在写的一个单页应用,我选择了 CORS

CORS 跨域方式,兼容性其实也不差,至少可以兼容到 IE8 IE9,

兼容 IE8 IE9,需要使用 XDomainRequest 代替 XMLHttpRequests

这个是完全可以接受的

跨域的具体应用

使用 CORS,其实主要都是服务器端的配置,都是设置一系列的响应头 (Response Headers)

```

Access-Control-Allow-Origin: http://www.YOURDOMAIN.com // 设置允许请求的域名,多个域名以逗号分隔

Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS // 设置允许请求的方法,多个方法以逗号分隔

Access-Control-Allow-Headers: Authorization // 设置允许请求自定义的请求头字段,多个字段以逗号分隔

Access-Control-Allow-Credentials: true // 设置是否允许发送 Cookies

```

服务端以 PHP 为例:

```

header('Access-Control-Allow-Origin: http://www.YOURDOMAIN.com');

header('Access-Control-Allow-Credentials: true'); //可选

header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');

header('Access-Control-Allow-Headers: Authorization');

// 判断如果是 OPTIONS 请求,直接退出即可

if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

exit;

}

echo json_encode(array('status' => '1', 'data' => ''));

?>

```

Javascript 代码直接使用 Ajax 即可:

```

$.ajax({

url: aURL,

type: aMethod,

data: aParams,

dataType: 'json',

timeout: 1000 * 120,

beforeSend: function (xhr) {

var token = $.cookie('token');

if (token) {

xhr.setRequestHeader('Authorization', 'Bearer ' + token);

}

},

success: function (response) {

if (response.code == 200) {

typeof aSuccess == 'function' && aSuccess(response.data);

} else {

typeof aError == 'function' && aError(response.message);

}

},

error: function(xhr, type){

typeof aError == 'function' && aError(xhr.status + ' ' + xhr.statusText);

}

});

```

参考链接

Ajax跨域CORS

在Ajax2.0中多了CORS允许我们跨域,但是其中有着几种的限制:Origin.Methods.Headers.Credentials 1.Origin 当浏览器用Ajax跨域请求的时候,会带上一个 ...

【JS】AJAX跨域-JSONP解决方案(一)

AJAX跨域介绍 AJAX 跨域访问是用户访问A网站时所产生的对B网站的跨域访问请求均提交到A网站的指定页面 由于安全方面的原因, 客户端js使用xmlhttprequest只能用来向来源网站发送请求 ...

ajax跨域问题解决方案

今天来记录一下关于ajax跨域的一些问题.以备不时之需. 跨域 同源策略限制 同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性.也就是说,受到请求的 URL 的域必须与当前 Web 页面 ...

ajax跨域问题解决方案(jsonp,cors)

跨域 跨域有三个条件,满足任何一个条件就是跨域 1:服务器端口不一致 2:协议不一致 3:域名不一致 解决方案: 1.jsonp 在远程服务器上设法动态的把数据装进js格式的文本代码段中,供客户端调用 ...

ajax跨域请求解决方案 CORS和JSONP

什么是跨域: 只要协议.域名.端口有任何一个不同,都会被当成不同的域.而由于浏览器的同源策略(同源策略:域名.协议.端口均相同),浏览器之间要隔离不同域的内容,禁止互相操作,不能执行其他网站的js.所 ...

PHP下ajax跨域的解决方案之CORS

由于安全的限制(同源策略,javascript只能访问同域名下的内容),如果需要进行跨域操作,那就免不了要进行跨域.   CORS(跨域资源共享,Cross-Origin Resource Shari ...

ajax跨域请求解决方案

大家好,今天我们学习了js的跨域请求的解决方案,由于JS中存在同源策略,当请求不同协议名,不同端口号.不同主机名下面的文件时,将会违背同源策略,无法请求成功!需要进行跨域处理! 方案一.后台PHP进行 ...

Ajax跨域访问解决方案

No 'Access-Control-Allow-Origin' header is present on the requested resource. 当使用ajax访问远程服务器时,请求失败,浏 ...

随机推荐

angularJ之$filter过滤器

1 内置filter 9个 2 自定义filter

ajax中cors解决跨域,AJAX 跨域 CORS 解决方案相关推荐

  1. ajax status php,解决laravel 出现ajax请求419(unknown status)的问题

    如下所示: 这个是因为laravel自带csrf验证的问题 解决方法 方法一:去关掉laravel的csrf验证,但这个人不建议,方法也不写出来了. 方法二:把该接口写到api.php上就好了 方法三 ...

  2. 12月12日学习内容整理:Ajax中的contentType参数,csrf跨域请求处理,serialize方法...

    一.contentType参数 1.用来标识请求的数据格式 2.默认值: "application/x-www-form-urlencoded"   代表是urlencoded编码 ...

  3. 用CORS 解决vue.js django跨域调用

    Cross-Origin Resource Sharing(CORS)跨域资源共享是一份浏览器技术的规范,提供了 Web 服务从不同域传来沙盒脚本的方法,以避开浏览器的同源策略,是 JSONP 模式的 ...

  4. ajax中迭代是什么意思,Ajax 局部刷新迭代器的内容

    最近在做个网站的.有个地方是想这样做的.就是滑动到下面.然后或触发滑动刷新事件.接着就通过ajax发送请求给action,之后从action获得数据后.局部更新内容.但现在的问题是.大部分地方都没问题 ...

  5. ajax中html的属性,jQuery Ajax加载html数据正常,但属性似乎'不可读'

    请在我疯了之前帮助我. 好吧,所以我一直在为我的代码苦苦挣扎了一周,但我仍然不知道什么是不工作的.jQuery Ajax加载html数据正常,但属性似乎'不可读' 我可以使用锚标记的data-targ ...

  6. ajax中url如何使用,jQuery Ajax url使用方式

    jQuery Ajax的使用场景: 页面需要通过后台逻辑,但只需要局部刷新以显示新的内容. jQuery Ajax url使用方式 1.servlet方式: 需要在struts.xml中写一个acti ...

  7. ajax中的换行符,jquery ajax在GET中删除换行符

    我需要从远程URL动态加载JavaScript文件,但在将它附加到标头之前,我必须对收到的脚本进行一些更改.jquery ajax在GET中删除换行符 的问题是:我得到的JS文件的内容,而不换行符,所 ...

  8. ajax中判空函数,jQuery Ajax成功函数数据为空?

    我是ajax/php的新手并且学习它.我试图通过ajax传递php值,但是我无法从php文件获取响应变量到ajax.尽管ajax成功,但为什么数据或结果或php的响应是NULL.这里有什么缺失,我无法 ...

  9. Ajax中的url使用规则

    Ajax中的url使用规则 Ajax中的url使用规则如下: 先封装项目访问地址: String basePath = request.getScheme() + "://" + ...

最新文章

  1. 离线安装Visual Studio Code插件
  2. python 仪表盘-Python笔记:制作和自定义仪表盘
  3. Python学习-基础篇3-函数篇(2)
  4. 基于DGCNN和概率图的轻量级信息抽取模型
  5. linux编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14
  6. 剑指offer试题(PHP篇一)
  7. Java 源程序与编译型运行区别
  8. java chatat delete,StringBuffer deleteCharAt(int index)
  9. Android 原生 MediaPlayer 和 MediaCodec 的区别和联系(二)
  10. MapReduce编程模型简介和总结
  11. VC++实现快速截屏
  12. Excel--单元格格式设置
  13. 仿京东商城主页(静态代码)
  14. android手机壁纸
  15. 实验楼linux命令,GitHub - encorechow/linux-command: Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。...
  16. 利用3000fps把人脸面部抠出来(一)
  17. 西门子PLc程序,博途V16 V17版1200与多台G120变频器通过过modbus RTU485 通讯控制,模拟量转
  18. HDU 2340 Obfuscation(dp)
  19. ThinkPHP5.1批量删除
  20. 基于java的水费管理系统

热门文章

  1. 汽车信息管理系统(课程设计))
  2. 从0到1打造高成功率的食品品牌系列(一)食品企业从0到1创建品牌的20大误区
  3. 上海外国语大学计算机比赛,上海外国语大学学生获得部级以上竞赛奖项列表.PDF...
  4. 阿里云盘强势来袭,内测资格,申请链接,开放申请了!非会员下载 10MB/s
  5. 太妙了!2021年java岗春招通关秘籍开放下载,喜大普奔
  6. php图像识别api,使用腾讯AI开放平台api进行图片OCR文字识别
  7. 怎么修改CAD软件界面背景色?
  8. autojump输入 j 命令加文件名 无法跳转 显示 ·
  9. 2021年学计算机玩吗,2021年计算机学校好吗
  10. 毒APP newSign算法分析 得物逆向分析