CORS跨域与@crossorigin
在这之前只是知道两者各自是什么,但却一直不清楚两者的关系,如今总结为下:
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-urlencoded
、multipart/form-data
、text/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-Control
、Content-Language
、Content-Type
、Expires
、Last-Modified
、Pragma
这六个基本字段的值)。
使用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请求会额外发送的头信息字段。
服务器收到"预检"请求以后,检查了Origin
、Access-Control-Request-Method
和Access-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相关推荐
- springBoot CORS跨域注解@CrossOrigin
1.概述 在任何现代浏览器中,随着 HTML5 和 JS 客户端的出现,跨域资源共享 (CORS)是一项相关规范,这些客户端通过 REST API 使用数据. 通常,服务于 JS 的主机(例如 exa ...
- spring MVC cors跨域实现源码解析
spring MVC cors跨域实现源码解析 名词解释:跨域资源共享(Cross-Origin Resource Sharing) 简单说就是只要协议.IP.http方法任意一个不同就是跨域. sp ...
- CORS 跨域 实现思路及相关解决方案(转:http://www.cnblogs.com/sloong/p/cors.html)
本篇包括以下内容: CORS 定义 CORS 对比 JSONP CORS,BROWSER支持情况 主要用途 Ajax请求跨域资源的异常 CORS 实现思路 安全说明 CORS 几种解决方案 自定义CO ...
- cors跨域_Nginx通过CORS配置实现跨域访问
什么是跨域 跨域是指跨域名的访问,以下情况都属于跨域: 跨域原因说明 示例 域名不同 www.jd.com 与 www.taobao.com 域名相同,端口不同 www.jd.com:8080 与 w ...
- python flask跨域_Flask配置Cors跨域的实现
1 跨域的理解 跨域是指:浏览器A从服务器B获取的静态资源,包括Html.Css.Js,然后在Js中通过Ajax访问C服务器的静态资源或请求.即:浏览器A从B服务器拿的资源,资源中想访问服务器C的资源 ...
- php跨域资源共享,CORS 跨域资源共享
CORS (Cross-Origin Resource Sharing) 跨域资源共享 为什么需要 CORS 首先,跨域指的是同一个域名下的资源,同时要注意域名与子域名,比如 developers.e ...
- javascript --- XMLHttp2级、CORS(跨域资源共享)
FormData: // 为序列化表单以及创建与表单格式相同的数据提供了便利 var data = new FromData(); data.append("name", &quo ...
- CORS——跨域请求那些事儿
[本期嘉宾介绍]睿得,具有多年研发.运维.安全等IT相关从业经历.目前从事CDN.存储.视频直播点播的技术支持.喜爱钻研,喜爱编码,喜爱分享. 在日常的项目开发时会不可避免的需要进行跨域操作,而在实际 ...
- cors跨域_Spring Boot 中通过 CORS 解决跨域问题
(给ImportNew加星标,提高Java技能) 转自:江南一点雨 今天和小伙伴们来聊一聊通过CORS解决跨域问题. 同源策略 很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的, ...
最新文章
- 各种 AI 数据增强方法,都在这儿了
- 网络推广软文之文章更新对网站排名的影响!
- 高手快帮忙,关于replace和正者表达式的问题
- 本机镜像仓库base64解密
- Python类的约束以及super()剖析
- Git学习笔记------整理自廖雪峰官网教程
- 前端学习(2347):创建新页面和配置
- [Buzz Today]2012.05.10
- 数字信号C语言——平均分布随机数
- hive教程:启动hive客户端
- 怎样维修无图纸电路板?
- 网友问答 | 关于I2C电平转换电路
- Android Material-dialogs的使用(kotlin)
- 智能家居Series
- python2在线编译器_C/C++/Python在线编译器
- np.pad()用于卷积网络中对图片进行填充
- tp3.2.3 图片打水印
- java.lang.IllegalStateException: response alrea...
- 量化交易之HFT篇 - 高频做市模型源码(.cpp文件)
- TC35i的TxD和RxD引脚定义
热门文章
- i米音标(赖世雄音标学习)——连音
- Sqlmap学习笔记(叁)
- 网络传输中的交换机和路由器
- 伯克利大学计算机专业排名,美国加州大学伯克利分校计算机专业排名
- jap @Query多条件灵活查询
- eac found not rust_rust进服务器卡eac | 手游网游页游攻略大全
- 各种门平面图画法_关于CAD各种门怎么画平面图就行?
- qdialog 只有点击才能获得焦点_白内障一定要“熟透了”才能手术吗?
- python微信机器人库_Python微信机器人
- Matlab画三维图的两种方法