CORS就是跨域吗?
首先,跨域的域是什么?
跨域的英文是:Cross-Origin。
Origin 中文含义为:起源,源头,出生地。
在跨域中,"域"指的是一个 Web 资源(比如网页、脚本、图片等)的源头。
包括该资源的协议、主机名、端口号。
在同源策略中,如果两个资源的域相同,则它们属于同一域,可以自由进行交互和共享数据。
反之,如果两个资源的域不同,就会出现跨域问题。
这时就需要特殊的方式来处理,如跨域资源共享(CORS)。
那什么是同源策略?
同源策略(Same-Origin Policy)是浏览器中的一项安全机制,用于保护用户的隐私和安全。
它限制了一个网页或者脚本只能从同一个源加载的资源进行访问,而不能访问其他来源的资源。
这样做可以防止恶意网站利用用户身份信息进行跨站请求伪造(CSRF)攻击,保护用户的数据安全。
什么是跨站请求伪造?
跨站请求伪造(CSRF,Cross-Site Request Forgery)是一种网络攻击方式。
在 CSRF 攻击中,攻击者利用已认证的用户身份(例如用户在银行网站上登录后的会话信息)来伪造请求,以执行未经授权的操作。
举个例子:
我登录了银行网站,浏览器根据我的登录信息生成了一个会话令牌,也就是 session token。
但是这个令牌被而恶意网站给拿到了,它拿着我的 token 去服务器发送请求。
就可以把我银行卡里的 29 块八毛五全部转走。
但是如果有同源策略的限制,恶意网站就无法直接发送请求到银行。
我的 29 块八毛五就可以保住。
因为恶意网站的域名与银行网站的域名不同,浏览器会阻止这种抢劫行为。
什么是跨域资源共享(CORS)?
为了防止被面试官笑话,这里一定要知道:
跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种用来解决由于浏览器的同源策略而导致的跨域请求问题的一种机制。
浏览器将 CORS 请求分成两类:
简单请求(simple request)和非简单请求(not-so-simple request)。
什么是简单请求?
只要同时满足以下两大条件,就属于简单请求。
(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
简单请求的工作流程如下:
1. 浏览器在请求中增加一个 Origin 头部字段,其中包含当前页面的源信息(协议、主机、端口)。
2. 服务器在收到这个请求后,会根据请求中的 Origin 头部信息来判断是否允许该请求。
3. 如果服务器允许该请求,会在响应头部中包含一个 Access-Control-Allow-Origin 头部,"*"表示允许所有来源。
4. 浏览器在收到响应后,决定是否允许页面访问该资源。
什么是非简单请求?
不是简单请求的,就是非简单请求。
非简单请求它非简单在哪?
或者说:
它非简单又能怎么样?
非简单请求在发起正式请求之前,会先发起一个预检请求。
什么是预检请求?
预检请求是用于在实际的跨域请求之前进行探测和验证,以确保服务器能够正确处理,预防跨域请求可能会引发的安全性问题。
一句话就是:
我去前面探探路!

只有得到服务器的肯定答复,浏览器才会发出正式的 XMLHttpRequest 请求,否则就报错。
实际 java 开发中的 CORS 解决跨域配置长这样:
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 允许所有的URL路径都可以跨域访问
registry.addMapping("/**")
// 允许所有来源(即允许任何域名)的请求跨域访问
.allowedOrigins("*")
// 允许发送身份验证信息(如cookies、HTTP身份验证或客户端SSL证明)
.allowCredentials(true)
// 允许跨域请求的HTTP方法,包括GET、POST、PUT、DELETE和OPTIONS。
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
// 预检请求(OPTIONS请求)的有效期,单位为秒
.maxAge(3600);
}
}
还有别的方式可以解决跨域问题吗?
有的。
使用 Nginx 部署为同一域。
什么意思呢?
就是说 Nginx 作为唯一域,代理所有服务端,在客户端眼里,只有 Nginx 这一个域,也就不存在跨域问题,由 Nginx 拿到请求再分发给对应服务器。
这里我们就不再展开。

往期推荐:
● 纪念JDBC
CORS就是跨域吗?的更多相关文章
- System.Web.Http.Cors配置跨域访问的两种方式
System.Web.Http.Cors配置跨域访问的两种方式 使用System.Web.Http.Cors配置跨域访问,众多大神已经发布了很多文章,我就不在详细描述了,作为小白我只说一下自己的使用心 ...
- HTML5安全:CORS(跨域资源共享)简介。。。ie67不要想了。。。
来源:http://blog.csdn.net/hfahe/article/details/7730944 前言:像CORS对于现代前端这么重要的技术在国内基本上居然很少有人使用和提及,在百度或者Go ...
- Angular通过CORS实现跨域方案
以前有一篇很老的文章网上转了很多,包括现在如果你百度"跨域"这个关键字,前几个推荐的都是"Javascript跨域总结与解决方案".看了一下感觉手段有点陈旧了, ...
- CORS(跨域资源共享)简介
前言:像CORS对于现代前端这么重要的技术在国内基本上居然很少有人使用和提及,在百度或者Google上搜索CORS,搜到的中文文章基本都是另外一种卫星定位技术CORS的介绍,让我等前端同学情何以堪(对 ...
- 跨域解决方案一:使用CORS实现跨域
跨站HTTP请求(Cross-site HTTP request)是指发起请求的资源所在域不同于请求指向的资源所在域的HTTP请求. 比如说,我在Web网站A(www.a.com)中通过<img ...
- HTML5安全:CORS(跨域资源共享)简介
前言:像CORS对于现代前端这么重要的技术在国内基本上居然很少有人使用和提及,在百度或者Google上搜索CORS,搜到的中文文章基本都是另外一种卫星定位技术CORS的介绍,让我等前端同学情何以堪(对 ...
- angularjs简单实现$http.post(CORS)跨域及$http.post传参方式模拟jQuery.post
1.开启angularjs的CORS支持 .config(function($httpProvider) { // CORS post跨域配置 $httpProvider.defaults.useXD ...
- 一步一步学习SignalR进行实时通信_3_通过CORS解决跨域
原文:一步一步学习SignalR进行实时通信_3_通过CORS解决跨域 一步一步学习SignalR进行实时通信\_3_通过CORS解决跨域 SignalR 一步一步学习SignalR进行实时通信_3_ ...
- TML5安全:CORS(跨域资源共享)简介
来源:http://blog.csdn.net/hfahe/article/details/7730944 前言:像CORS对于现代前端这么重要的技术在国内基本上居然很少有人使用和提及,在百度或者Go ...
- CORS(跨域资源共享) 的配置
http://blog.csdn.net/ohyoyo2014/article/details/24863197 兼容情况: 各种新版本的ie10,firefox,opera,safari,chrom ...
随机推荐
- 针对docker中的mongo容器增加鉴权
1. 背景 业务方的服务器经安全检查,发现以docker容器启动的mongo未增加鉴权的漏洞,随优化之 2. 配置 mongo以docker compose方式启动,镜像的版本号为4.2.6,dock ...
- 【面试题精讲】MySQL中覆盖索引是什么
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 在MySQL中,覆盖索引是一种特殊类型的索引,它 ...
- [转帖]Docker资源(CPU/内存/磁盘IO/GPU)限制与分配指南
https://zhuanlan.zhihu.com/p/417472115 什么是cgroup? cgroups其名称源自控制组群(control groups)的简写,是Linux内核的一个功能, ...
- 【转帖】nginx变量使用方法详解-6
https://www.diewufeiyang.com/post/580.html Nginx 内建变量用在"子请求"的上下文中时,其行为也会变得有些微妙. 前面在 (三) 中我 ...
- [转帖]解决vCenter6.x由于证书过期问题无法登录
https://www.dinghui.org/vcenter-sts-certificate.html#:~:text=%E8%BF%99%E6%97%B6%E5%80%99%EF%BC%8C%E5 ...
- [转帖]比 Python 快 35000 倍!LLVM&Swift 之父宣布全新编程语言 Mojo:编程被颠覆了
https://www.infoq.cn/article/GFfVLVpkIGOcKYB85Opb "Mojo 可能是近几十年来最大的编程语言进步." 近日,由 LLVM 和 Sw ...
- [转帖]springboot中使用skywalking实现日志追踪
文章目录 SkyWalking分布式追踪系统 介绍 主要架构 环境 引入依赖 配置Log4j2 下载编译好的8.7.0版本包 使用探针实现日志追踪 启动脚本 启动Java服务 访问服务 使用UI 切换 ...
- [转帖]SPECjvm测试工具详解
ARM服务器测试大纲中指定了要使用specjvm测试Java虚拟机性能,所以就上网找开源的测试套. 简介 SPECjvm2008(java虚拟机基准测试)是用来测试java运行环境(JRE)性能的基准 ...
- JVM 堆外内存查看方法
JVM 堆外内存查看方法 JVM 堆外内存查看方法 1.概述 是否曾经想过为什么Java应用程序通过众所周知的*-Xms和-Xmx调整标志消耗的内存比指定的数量大得多 ?由于各种原因和可能的优化,JV ...
- protojson简介
google.golang.org/protobuf/encoding/protojson 是 Go 语言中的一个库,用于处理 Protocol Buffers(protobuf)和 JSON 之间的 ...