什么是CORS?

默认情况下,为预防某些而已行为,浏览器的XHR对象只能访问来源于同一个域中的资源。但是我们在日常实际开发中,常常会遇到跨域请求的需求,因此就出现了一种跨域请求的方案:CORS(Cross-Origin Resource Sharing)跨域资源共享。

CORS背后的原理是:使用自定的HTTP头部与服务器进行沟通,从而由服务器决定响应是否成功

如何使用CORS?

使用CORS需要客户端和服务端两者配合。

一、客户端如何发起CORS跨域请求?

目前在大多数浏览器下(CORS在各浏览器下支持情况),都原生支持CORS,代码编写时和同域的请求差不多,只需要在xhr.open()的时候传入绝对URL即可。例如:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if(xhr.readyState == 4){
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
console.log(xhr.responseText)
}else {
console.log('err' + xhr.status);
}
}
};
xhr.open('get','http://www.xxx.com/api/something/',true);
xhr.send(null);

这样就可以发送一个跨域请求了,但是如果只是如上面示例代码一样发送的话会报错,因为服务器并未设置允许我们这个请求,因此CORS还需要服务端来配合。

二、服务器如何允许客户的CORS跨域请求?

服务器只需要在响应头部中设置Access-Control-Allow-Origin即可让客户端访问。

假设客户端的域名是http://www.xxx.com,那么服务端只要在Access-Control-Allow-Origin的设置中含有http://www.xxx.com,那么这个CORS请求即可成功。如果Access-Control-Allow-Origin设置为*,那么任意域名都可以访问这个服务端,但是为了安全起见,一般并不建议这样做。

以下截图是一个CORS请求后服务端正常返回的示例:

Preflighted Request

CORS还有一种叫做Preflighted Request(预飞请求)的透明服务器验证机制完成请求过程,如果你在请求的时候使用了表1中的选项来发送请求(使用setRequestheaders设定自定义头部),那么就会触发Preflighted Request,它的请求过程如下:

1.XHR对象send发出请求

2.浏览器先向服务端发出一个OPTIONS方法的请求,并发送下列头部:

  • 表1
请求头部信息 含义
Origin 来源域名,与简单的请求相同。
Access-Control-Request-Method 请求自身使用的方法。
Access-Control-Request-Headers (可选) 自定义的头部信息,多个头部以逗号分隔。

OPTIONS请求示例:

客户端请求的代码(比上面多加了个header):

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function () {
if(xhr.readyState == 4){
if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
console.log(xhr.responseText)
}else {
console.log('err' + xhr.status);
}
}
};
xhr.open('get','http://www.xxx.com/api/poisearch/',true);
xhr.setRequestHeader('haha',1);
xhr.send(null);

请求结果(这里OPTIONS请求触发了,但没有找到这个url):

3.服务器接收到这个请求后,根据上面的头部信息判断是否予以接收。并在响应中发送如下头部与浏览器进行沟通:

  • 表2
响应头部信息 含义
Access-Control-Allow-Origin 来源域名,与简单的请求相同。
Access-Control-Allow-Methods 允许的方法,多个方法以逗号分隔。
Access-Control-Allow-Headers(可选) 允许的头部,多个头部以逗号分隔。
Access-Control-Max-Age 应该将这个Preflight请求缓存多长时间(以秒表示)

4.Preflighted Request结束后,结果将按照指定的时间缓存起来。

5.如果服务端判断上面设置的额外信息可以允许请求,那么就会再请求一次正常的请求了。

CORS跨域资源共享简述的更多相关文章

  1. CORS跨域资源共享

    CORS(跨域资源共享)跨域问题及解决 当使用ajax跨域请求时,浏览器报错:XmlHttpRequest error: Origin null is not allowed by Access-Co ...

  2. CORS跨域资源共享你该知道的事儿

    "唠嗑之前,一些客套话" CORS跨域资源共享,这个话题大家一定不陌生了,吃久了大转转公众号的深度技术好文,也该吃点儿小米粥溜溜胃里的缝儿了,今天咱们就再好好屡屡CORS跨域资源共 ...

  3. 在ASP.NET Web API中实现CORS(跨域资源共享)

    默认情况下,是不允许网页从不同的域访问服务器资源的,访问遵循"同源"策略的原则. 会遇到如下的报错: XMLHttpRequest cannot load http://local ...

  4. django上课笔记7-jQuery Ajax 和 原生Ajax-伪造的Ajax-三种Ajax上传文件方法-JSONP和CORS跨域资源共享

    一.jQuery Ajax 和 原生Ajax from django.conf.urls import url from django.contrib import admin from app01 ...

  5. 跨域漏洞丨JSONP和CORS跨域资源共享

    进入正文之前,我们先来解决个小问题,什么是跨域? 跨域:指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器的安全限制! 跨域常见的两种方式,分别是JSONP和CORS. 今天i ...

  6. 浅谈跨域问题,CORS跨域资源共享

    1,何为跨域? 在理解跨域问题之前,你先要了解同源策略和URL,简单叙述: 1)同源策略 三同:协议相同,域名相同,端口相同: 目的:保证用户信息安全,防止恶意网站窃取数据.同源策略是必须的,否则co ...

  7. CORS跨域资源共享总结

    1.CORS简述 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源(协议 + 域名 + 端口)服务 ...

  8. Node.js实现CORS跨域资源共享

    什么是CORS CORS(Cross-origin resource sharing),跨域资源共享,是一份浏览器技术的规范,用来避开浏览器的同源策略 简单来说就是解决跨域问题的除了jsonp外的另一 ...

  9. tomcat7.0配置CORS(跨域资源共享)

    平时我们做前台页面时可能会遇到浏览器以下提示(浏览器控制台): 已阻止跨源请求:同源策略禁止读取位于 http://xxx.xxx.com 的远程资源.(原因:CORS 头缺少 'Access-Con ...

随机推荐

  1. UPF Usage

    在 multi-voltage design 中,当涉及到多个power supply 时,需要 upf 文件来描述power细节,现将 upf 中的基本概念和使用方法记录如下: upf 中的基本概念 ...

  2. JS图片灯箱(lightBox)效果基本原理和demo

    到年底了,项目不怎么忙,所以有空特地研究了下KISSY中源码JS灯箱效果,感觉代码比较简单,所以就按照他们的思路依赖于Jquery框架也封装了一个,特地分享给大家,以前经常看到网上很多这样的插件,感觉 ...

  3. Jredis的使用范例

    简单使用 public class JedisTest { private static final Logger LOGGER = LoggerFactory.getLogger(JedisTest ...

  4. scapy学习笔记(5)

    1.ACK Scan >>>ans,unans=sr(IP(dst=,],flags="A") 扫描后,若要找出未过虑的端口: for s,r in ans: i ...

  5. Codeforces round 1100

    Div 2 532 我对交互一无所知 只能寄期望与NOI和省选不出交互吧... E 这个题,真的是耻辱... 其实非常简单,就是二分+判环... 那么就直接二分答案+拓扑排序即可... (我居然在考试 ...

  6. 【LeetCode234】Palindrome Linked List★

    题目描述: 解题思路: 判断一个单向链表是否是回文链表,并且要求O(n)的时间复杂度和O(1)的空间复杂度. 方法有以下几种: 1.遍历整个链表,将链表每个节点的值记录在数组中,再判断数组是不是一个回 ...

  7. 《基于Cortex-M4的ucOS-III的应用》课程设计 结题报告

    <基于Cortex-M4的ucOS-III的应用>课程设计 结题报告 小组成员姓名:20155211 解雪莹 20155217 杨笛 20155227 辜彦霖 指导教师:娄嘉鹏 一.设计方 ...

  8. 20155229《网络对抗技术》Exp8:Web基础

    实验内容 (1).Web前端HTML 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML. (2).Web前端javascipt 理解JavaS ...

  9. Luogu P1198 [JSOI2008]最大数

    我会用高级(???)的单调栈来打这道题吗? 线段树即可水过. 假设这个数列刚开始所有数都是0,然后我们每次只要进行一个点的修改和区间求和即可. 这不就是 线段树大法. 只要用一个len记录一下当前数列 ...

  10. 阿里云Linux系统基线检查优化

    1.用户权限配置文件的权限优化 描述:设置用户权限配置文件的权限 操作时建议做好记录或备份 chown root:root /etc/passwd /etc/shadow /etc/group /et ...