跨域资源共享(CORS)

简介: 跨域资源共享(CORS)

预检请求

预检请求(Preflight Request)是跨域资源共享(CORS)机制中的一种特殊请求,主要用于在实际请求之前进行安全性检查。当一个请求可能不满足同源策略(即请求的源与目标资源的源不同,源包括协议、域名和端口)时,浏览器会先发送一个 OPTIONS 请求到服务器,以检查是否允许执行即将进行的请求。这就是所谓的预检请求。


预检请求的主要作用包括:


检查跨域请求的安全性:预检请求用于验证是否允许发起跨域请求,从而确保跨域请求的安全性。这有助于防止潜在的安全风险,如跨站请求伪造(CSRF)攻击。


检查跨域请求的支持:服务器通过预检请求可以检查客户端的请求头(Request Headers)和方法(HTTP Methods),以确定是否支持特定的跨域请求。


提供更好的错误信息:如果服务器不支持跨域请求,预检请求可以提供更详细的错误信息,以便客户端开发者了解问题所在。


需要注意的是,并非所有的跨域请求都会发送预检请求。对于幂等的请求,如 GET 请求,通常不会发送预检请求。而那些可能会改变服务器状态的请求,如 POST、DELETE 和 PUT 请求,则可能会发送预检请求。


如果不设置会出错NOT FOUND,例如:

 
    GET http://localhost:8000/users/list 404 (Not Found)

预检请求是由浏览器自动发出的,前端开发者通常不会直接处理或意识到它的存在。当预检请求通过后,浏览器才会发送实际的请求。如果预检请求未通过,浏览器将抛出一个 CORS 错误,阻止实际请求的发送。

预检请求是由浏览器自动发出的,前端开发者通常不会直接处理或意识到它的存在。当预检请求通过后,浏览器才会发送实际的请求。如果预检请求未通过,浏览器将抛出一个 CORS 错误,阻止实际请求的发送。


为了确保跨域请求能够顺利进行,服务器需要正确配置以响应预检请求,这通常涉及到设置适当的响应头,如 Access-Control-Allow-Origin、Access-Control-Allow-Methods 和 Access-Control-Allow-Headers 等。这些响应头告诉浏览器服务器允许哪些源、方法和请求头进行跨域访问。


预检请求和CORS有什么区别

预检请求(Preflight Request)和CORS(跨源资源共享)是两个在Web开发中经常出现的概念,它们之间有着紧密的联系,但也有着明确的区别。


CORS是一种W3C标准,它定义了一种浏览器和服务器交互的方式来确定是否允许跨源请求。简单来说,CORS允许服务器通过发送适当的HTTP头来告诉浏览器,哪些源(协议+域名+端口)有权限访问其资源。这允许前端JavaScript代码从不同的源加载和执行资源,从而突破了同源策略的限制。


而预检请求则是CORS机制中的一个重要部分。当一个请求不满足同源策略,并且可能引发副作用(例如,除了GET之外的其他HTTP请求,或者具有某些MIME类型的POST请求)时,浏览器会首先发送一个OPTIONS方法的预检请求到服务器。这个预检请求的目的是询问服务器是否允许执行即将进行的跨域请求。服务器如果确认允许,会返回相应的响应头,然后浏览器才会发送实际的请求。


因此,可以说预检请求是CORS实现过程中的一种具体手段或步骤,而CORS是一个更广泛的概念,它包含了解决跨域资源共享问题的整体策略和方法。


总的来说,预检请求和CORS是相互配合的,预检请求是实现CORS机制的一部分,用于在发送实际请求之前进行安全性和可行性的检查。


OPTIONS请求

OPTIONS请求在HTTP协议中是一种特殊类型的请求,它主要用于获取目的资源所支持的通信选项。当浏览器遇到跨域请求(即请求的源与目标资源的源不同)时,可能会先发送一个OPTIONS请求到服务器,这通常被称为“预检请求”或“CORS预检请求”。


预检请求的主要作用是检查服务器是否允许执行即将进行的跨域请求。浏览器会在正式请求之前自动发起OPTIONS请求,服务器若接受该跨域请求,浏览器才会继续发起正式请求。这样做是为了确保跨域请求的安全性,防止潜在的安全风险。


在预检请求的返回中,服务器会包含一些特定的响应头,如Access-Control-Allow-Origin、Access-Control-Allow-Methods和Access-Control-Allow-Headers等,这些响应头告诉浏览器服务器允许哪些源、方法和请求头进行跨域访问。


需要注意的是,并非所有的跨域请求都会发送预检请求。例如,简单的GET请求通常不会触发预检请求。但是,对于可能改变服务器状态的请求(如POST、PUT、DELETE等),或者包含某些特定请求头的请求,浏览器通常会发送预检请求。


总的来说,OPTIONS请求在跨域请求中扮演着重要的角色,它帮助浏览器和服务器之间进行安全的通信,确保跨域请求能够按照预期进行。


目录
相关文章
|
2月前
|
JSON 安全 前端开发
浅析CORS跨域漏洞与JSONP劫持
浅析CORS跨域漏洞与JSONP劫持
71 3
|
9天前
|
JSON 前端开发 安全
CORS 是什么?它是如何解决跨域问题的?
【10月更文挑战第20天】CORS 是一种通过服务器端配置和浏览器端协商来解决跨域问题的机制。它为跨域资源共享提供了一种规范和有效的方法,使得前端开发人员能够更加方便地进行跨域数据交互。
|
22天前
|
缓存 前端开发 应用服务中间件
CORS跨域+Nginx配置、Apache配置
CORS跨域+Nginx配置、Apache配置
94 7
|
28天前
|
安全 前端开发 网络协议
[Http] 跨源资源共享(CORS)
[Http] 跨源资源共享(CORS)
|
2月前
|
安全
CORS 跨域资源共享的实现原理
CORS 跨域资源共享的实现原理
|
5月前
|
前端开发 安全 JavaScript
Spring Boot2 系列教程(十四)CORS 解决跨域问题
Spring Boot2 系列教程(十四)CORS 解决跨域问题
|
6月前
|
存储 安全 前端开发
第五章 跨域资源共享(CORS):现代Web开发中的关键机制
第五章 跨域资源共享(CORS):现代Web开发中的关键机制
170 1
|
3月前
|
Web App开发 JSON 数据格式
【Azure Developer】浏览器查看本地数据文件时遇见跨域问题(CORS)
【Azure Developer】浏览器查看本地数据文件时遇见跨域问题(CORS)
【Azure Developer】浏览器查看本地数据文件时遇见跨域问题(CORS)
|
3月前
|
API
【Azure Function】Function本地调试时遇见跨域问题(blocked by CORS policy)
【Azure Function】Function本地调试时遇见跨域问题(blocked by CORS policy)
【Azure Function】Function本地调试时遇见跨域问题(blocked by CORS policy)
|
3月前
|
安全 前端开发 Java
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
在Web安全上下文中,源(Origin)是指一个URL的协议、域名和端口号的组合。这三个部分共同定义了资源的来源,浏览器会根据这些信息来判断两个资源是否属于同一源。例如,https://www.example.com:443和http://www.example.com虽然域名相同,但由于协议和端口号不同,它们被视为不同的源。同源(Same-Origin)是指两个URL的协议、域名和端口号完全相同。只有当这些条件都满足时,浏览器才认为这两个资源来自同一源,从而允许它们之间的交互操作。
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例