首先,跨域的域是什么?

跨域的英文是: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 拿到请求再分发给对应服务器。

这里我们就不再展开。


往期推荐:

● 师爷,翻译翻译什么叫AOP

翻译,师爷师爷什么叫事务

纪念JDBC

● SpringBoot实现动态数据源配置

● 聚簇索引、回表与覆盖索引

Java锁到底是个什么东西

CORS就是跨域吗?的更多相关文章

  1. System.Web.Http.Cors配置跨域访问的两种方式

    System.Web.Http.Cors配置跨域访问的两种方式 使用System.Web.Http.Cors配置跨域访问,众多大神已经发布了很多文章,我就不在详细描述了,作为小白我只说一下自己的使用心 ...

  2. HTML5安全:CORS(跨域资源共享)简介。。。ie67不要想了。。。

    来源:http://blog.csdn.net/hfahe/article/details/7730944 前言:像CORS对于现代前端这么重要的技术在国内基本上居然很少有人使用和提及,在百度或者Go ...

  3. Angular通过CORS实现跨域方案

    以前有一篇很老的文章网上转了很多,包括现在如果你百度"跨域"这个关键字,前几个推荐的都是"Javascript跨域总结与解决方案".看了一下感觉手段有点陈旧了, ...

  4. CORS(跨域资源共享)简介

    前言:像CORS对于现代前端这么重要的技术在国内基本上居然很少有人使用和提及,在百度或者Google上搜索CORS,搜到的中文文章基本都是另外一种卫星定位技术CORS的介绍,让我等前端同学情何以堪(对 ...

  5. 跨域解决方案一:使用CORS实现跨域

    跨站HTTP请求(Cross-site HTTP request)是指发起请求的资源所在域不同于请求指向的资源所在域的HTTP请求. 比如说,我在Web网站A(www.a.com)中通过<img ...

  6. HTML5安全:CORS(跨域资源共享)简介

    前言:像CORS对于现代前端这么重要的技术在国内基本上居然很少有人使用和提及,在百度或者Google上搜索CORS,搜到的中文文章基本都是另外一种卫星定位技术CORS的介绍,让我等前端同学情何以堪(对 ...

  7. angularjs简单实现$http.post(CORS)跨域及$http.post传参方式模拟jQuery.post

    1.开启angularjs的CORS支持 .config(function($httpProvider) { // CORS post跨域配置 $httpProvider.defaults.useXD ...

  8. 一步一步学习SignalR进行实时通信_3_通过CORS解决跨域

    原文:一步一步学习SignalR进行实时通信_3_通过CORS解决跨域 一步一步学习SignalR进行实时通信\_3_通过CORS解决跨域 SignalR 一步一步学习SignalR进行实时通信_3_ ...

  9. TML5安全:CORS(跨域资源共享)简介

    来源:http://blog.csdn.net/hfahe/article/details/7730944 前言:像CORS对于现代前端这么重要的技术在国内基本上居然很少有人使用和提及,在百度或者Go ...

  10. CORS(跨域资源共享) 的配置

    http://blog.csdn.net/ohyoyo2014/article/details/24863197 兼容情况: 各种新版本的ie10,firefox,opera,safari,chrom ...

随机推荐

  1. 修改Keil uvison4 字体样式

    1.点击扳手配置 2.点击Colors & Fonts,选择其中的8051:Editor C Files,选择Text,点击右侧的Courier New... 3.在里面就可以调节字体了

  2. std::istringstream的用法

    1.概要 std::istringstream 是 C++ 标准库中的一个类,它用于从字符串中提取数据,并将数据转换为不同的数据类型.它通常用于从字符串中解析数据,例如整数.浮点数等.以下是关于 st ...

  3. [转帖]TLS/SSL (Schannel SSP) 中的密码套件

    https://learn.microsoft.com/zh-cn/windows/win32/secauthn/cipher-suites-in-schannel 密码套件是一组加密算法. TLS/ ...

  4. [转帖]rclone将本地文件或文件夹导入minio中

    1.背景:公司数据迁移涉及到文件迁移,原有文件服务器没有使用minio,但是现在的新系统使用了minio.所以这就需要我们将文件上传到minio文件服务器中:由于历史文件数据量大,甲方要求可以通过服务 ...

  5. 华城金锐申威SW64服务器重装过程

    华城金锐申威SW64服务器重装过程 背景 这边为了进行兼容性验证新进了两套申威的服务器. 一台机器带着安装好的操作系统了. 但是另外一套没有对应的系统. 端午期间想着趁着上班的人少, 加吧给处理一下. ...

  6. 【转帖】mysql一个索引块有多少指针_深刻理解MySQL系列之索引

    索引 查找一条数据的过程 先看下InnoDB的逻辑存储结构:node 表空间:能够看作是InnoDB存储引擎逻辑结构的最高层,全部的数据都存放在表空间中.默认有个共享表空间ibdata1.若是启用in ...

  7. [转帖]Java 平台调试体系

    https://www.cnblogs.com/xiaojiesir/p/15652619.html Java 平台调试体系(Java Platform Debugger Architecture,J ...

  8. zabbix基于容器化在UOS1050E上面的安装与使用

    前言 想着能够监控一下操作系统的日志. 因为国产化的需求, 所以我这边使用了UOS1050E 安装zabbix时多次提示缺少php-json 或者是缺少一些libevent等组件. 自己尝试进行解决发 ...

  9. linux线程调度策略

    linux线程调度策略 这是一篇非常好的关于线程调度的资料,翻译自shed 目录 linux线程调度策略 Scheduling policies SCHED_FIFO: First in-first ...

  10. 【VictoriaMetrics的vmbackupmanager】这个一年卖 2 万美元的功能,我做出来了

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 1.背景 在可观测领域的 metrics 解决方案中,Vi ...