在这之前只是知道两者各自是什么,但却一直不清楚两者的关系,如今总结为下:

CORS,全称是"跨域资源共享"(Cross-origin resource sharing)

它允许浏览器向跨源服务器发出XMLHttpRequest请求,从而克服了Ajax只能同源使用的限制。

基本思想是:使用自定义的HTTP头部允许服务器和浏览器相互了解对方,从而决定请求或响应成功与否。

处理简单请求:

(1) 请求方法是以下三种方法之一:

  • HEAD
  • GET
  • POST

(2)HTTP的头信息不超出以下几种字段:

  • Accept
  • Accept-Language
  • Content-Language
  • Last-Event-ID
  • Content-Type:只限于三个值application/x-www-form-urlencodedmultipart/form-datatext/plain

浏览器直接发出CORS请求。具体来说,就是在头信息之中,增加一个Origin字段用来说明,本次请求来自哪个源(协议 + 域名 + 端口)。服务器根据这个值,决定是否同意这次请求。

与CORS有关的头部是:

  • Access-Control-Allow-Origin:*,即为接受全部,而为了防止XSS攻击,我们需要把这个头部的值限制为某个域,如:Access-Control-Allow-Origin: http://www.csdn.net;
  • Access-Control-Allow-Credentials:true/false;表示是否允许发送cookie,默认情况下,不会自动带上cookie,这个值为true时为表示服务器明确许可,cookie可以包含在请求中,需配合Ajax中的withCredentials = true来携带cookie发送请求。
  • Access-Control-Expose-Headers:foobar;可选字段。在该字段里指定返回字段,就可以通过XMLHttpRequest对象的getResponseHeader()方法拿到foobar字段的值。(通常只能拿到Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma 这六个基本字段的值)。

使用CORS需要注意:

  • Ajax请求中需要设置withCredentials = true;并且这时Access-Control-Allow-Origin的值不能为*,须为具体域名。
  • Access-Control-Allow-Origin不能配置多个请求服务器,但可以通过静态配置多个的方式,根据referer匹配,匹配到相对应的设置Access-Control-Allow-Origin为这个方式。

处理非简单请求:

不是简单请求则为非简单请求,如请求方法是PUT或者DELETE,或者Content-Type字段的类型是application/json。

非简单请求的CORS请求,会在正式通信之前增加一次HTTP查询请求,称为“预检”请求。

浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。

  • 预检请求用的方法是OPTIONS,表示这个请求是用来询问的。关键字段是Origin,表示请求来自哪个源。
  • 除了Origin之外,还有两个特殊字段:
  • Access-Control-Request-Method:该字段是必须的,用来列出CORS请求会用到那些方法。
  • Access-Control-Request-Headers:该字段是一个逗号分隔的字符串,指定浏览器CORS请求会额外发送的头信息字段。

服务器收到"预检"请求以后,检查了OriginAccess-Control-Request-MethodAccess-Control-Request-Headers字段以后,确认允许跨源请求,就可以做出回应。

@crossorigin:Handler阶段的CORS

概念:

@crossorigin是后端SpringMVC框架(需4.2版本以上)Controller层的一个注解,这个注解是用在控制器方法上的,其实Spring在这里用的还是CorsInterceptor,做最后一层拦截,这也就解释了为什么CorsInterceptor永远是最后一个执行的拦截器。可处理跨域请求,设置为:

@crossorigin(origins = "*",maxAge = 3600)

例:

// 先把WebConfig中前两阶段的配置(CorsFilter和CorsInterceptor)注释掉,再到这里加跨域注解
@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(method = RequestMethod.GET)
List<User> getList() {return Lists.newArrayList(userdb.asMap().values());
}

另外两个不同阶段:

  • CorsFilter: 过滤器阶段的CORS,
  • CorsInterceptor: 拦截器阶段的CORS

以上CORS资料来自阮一峰大神:跨域资源共享CORS详解

@crossorigin资料来自简书:SpringMVC开启CORS支持

CORS跨域与@crossorigin相关推荐

  1. springBoot CORS跨域注解@CrossOrigin

    1.概述 在任何现代浏览器中,随着 HTML5 和 JS 客户端的出现,跨域资源共享 (CORS)是一项相关规范,这些客户端通过 REST API 使用数据. 通常,服务于 JS 的主机(例如 exa ...

  2. spring MVC cors跨域实现源码解析

    spring MVC cors跨域实现源码解析 名词解释:跨域资源共享(Cross-Origin Resource Sharing) 简单说就是只要协议.IP.http方法任意一个不同就是跨域. sp ...

  3. CORS 跨域 实现思路及相关解决方案(转:http://www.cnblogs.com/sloong/p/cors.html)

    本篇包括以下内容: CORS 定义 CORS 对比 JSONP CORS,BROWSER支持情况 主要用途 Ajax请求跨域资源的异常 CORS 实现思路 安全说明 CORS 几种解决方案 自定义CO ...

  4. cors跨域_Nginx通过CORS配置实现跨域访问

    什么是跨域 跨域是指跨域名的访问,以下情况都属于跨域: 跨域原因说明 示例 域名不同 www.jd.com 与 www.taobao.com 域名相同,端口不同 www.jd.com:8080 与 w ...

  5. python flask跨域_Flask配置Cors跨域的实现

    1 跨域的理解 跨域是指:浏览器A从服务器B获取的静态资源,包括Html.Css.Js,然后在Js中通过Ajax访问C服务器的静态资源或请求.即:浏览器A从B服务器拿的资源,资源中想访问服务器C的资源 ...

  6. php跨域资源共享,CORS 跨域资源共享

    CORS (Cross-Origin Resource Sharing) 跨域资源共享 为什么需要 CORS 首先,跨域指的是同一个域名下的资源,同时要注意域名与子域名,比如 developers.e ...

  7. javascript --- XMLHttp2级、CORS(跨域资源共享)

    FormData: // 为序列化表单以及创建与表单格式相同的数据提供了便利 var data = new FromData(); data.append("name", &quo ...

  8. CORS——跨域请求那些事儿

    [本期嘉宾介绍]睿得,具有多年研发.运维.安全等IT相关从业经历.目前从事CDN.存储.视频直播点播的技术支持.喜爱钻研,喜爱编码,喜爱分享. 在日常的项目开发时会不可避免的需要进行跨域操作,而在实际 ...

  9. cors跨域_Spring Boot 中通过 CORS 解决跨域问题

    (给ImportNew加星标,提高Java技能) 转自:江南一点雨 今天和小伙伴们来聊一聊通过CORS解决跨域问题. 同源策略 很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的, ...

最新文章

  1. 各种 AI 数据增强方法,都在这儿了
  2. 网络推广软文之文章更新对网站排名的影响!
  3. 高手快帮忙,关于replace和正者表达式的问题
  4. 本机镜像仓库base64解密
  5. Python类的约束以及super()剖析
  6. Git学习笔记------整理自廖雪峰官网教程
  7. 前端学习(2347):创建新页面和配置
  8. [Buzz Today]2012.05.10
  9. 数字信号C语言——平均分布随机数
  10. hive教程:启动hive客户端
  11. 怎样维修无图纸电路板?
  12. 网友问答 | 关于I2C电平转换电路
  13. Android Material-dialogs的使用(kotlin)
  14. 智能家居Series
  15. python2在线编译器_C/C++/Python在线编译器
  16. np.pad()用于卷积网络中对图片进行填充
  17. tp3.2.3 图片打水印
  18. java.lang.IllegalStateException: response alrea...
  19. 量化交易之HFT篇 - 高频做市模型源码(.cpp文件)
  20. TC35i的TxD和RxD引脚定义

热门文章

  1. i米音标(赖世雄音标学习)——连音
  2. Sqlmap学习笔记(叁)
  3. 网络传输中的交换机和路由器
  4. 伯克利大学计算机专业排名,美国加州大学伯克利分校计算机专业排名
  5. jap @Query多条件灵活查询
  6. eac found not rust_rust进服务器卡eac | 手游网游页游攻略大全
  7. 各种门平面图画法_关于CAD各种门怎么画平面图就行?
  8. qdialog 只有点击才能获得焦点_白内障一定要“熟透了”才能手术吗?
  9. python微信机器人库_Python微信机器人
  10. Matlab画三维图的两种方法