http 跨域资源共享详解

news2024/11/26 16:47:17

http 跨域资源共享详解

由于浏览器同源策略限制,会导致出现跨域问题。而跨域资源共享(CORS)可以突破浏览的同源策略的限制,不过需要服务端配合设置相应的响应头,从而使跨源数据传输得以安全进行。

跨域资源共享新增了一些HTTP字段,用于与服务器相互配合。

Origin: http://foo.example
(告诉服务器来自哪个域, 浏览器自动设置,不允许手动设置)
Access-Control-Request-Method: POST
(告诉服务器使用的请求方式)
Access-Control-Request-Headers: X-PINGOTHER, Content-Type
(告诉服务器要携带的特殊请求头字段)

而服务器也需要相应设置这些内容

Access-Control-Allow-Origin: http://foo.example
(允许这个域的请求访问服务器资源,如果为*代表允许任何域的请求访问服务器资源, 手动设置)
Access-Control-Allow-Methods: POST, GET, OPTIONS
(允许这些种类的请求方式访问服务器资源)
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
(允许请求头中可以包含这些特殊字段)
Access-Control-Max-Age: 86400
(设置预检请求的缓存时间,即针对同一个跨域的复杂请求,不必每次都先发送一次预检请求,该属性不是必须)

跨域资源共享的规范要求,对于一些可能对服务器数据产生副作用的http方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型 的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求,从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实际的HTTP请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证。

预检(preflight request

预检用来检查服务器是否支持跨域资源共享。

预检并不需要前端开发者手动发送,当需要时,浏览器会自动发送(使用OPTIONS

fetch 标准
对于XMLHttpRequest来说,可以使用以下三种场景来描述跨源资源共享机制的工作原理。

工作原理

简单请求

某些请求不会触发 CORS 预检请求。在废弃的 CORS spec 中称这样的请求为简单请求,但是目前的 Fetch specCORS 的现行定义规范)中不再使用这个词语。

当满足下面所有条件,这个请求就是简单请求:

  • 使用请求方法为GETHEADPOST的其中一个
  • 不得手动设置除 AcceptAccept-LanguageContent-LanguageContent-Type外的请求头。
  • Content-Type的值只能为text/plainmultipart/form-dataapplication/x-www-form-urlencoded的其中一个
const xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost:3000");
xhr.onreadystatechange = function () {
  console.log("readyState:" + xhr.readyState);
};
xhr.send();

请求标头

Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 0
Host: localhost:3000
Origin: http://localhost:8080
Pragma: no-cache
Referer: http://localhost:8080/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36

响应标头

Access-Control-Allow-Origin: http://localhost:8080
Connection: keep-alive
Date: Thu, 17 Nov 2022 15:10:23 GMT
Keep-Alive: timeout=5
Transfer-Encoding: chunked

预检请求

与前述简单请求不同,“需预检的请求”要求必须首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。

const xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost:3000");
xhr.setRequestHeader("Content-Type", "application/json;charset=utf-8");
xhr.onreadystatechange = function () {
  console.log("readyState:" + xhr.readyState);
};
xhr.send(JSON.stringify({ data: 1 }));

通过浏览器的控制台可以看到实际上发了两个请求
预检请求

上面请求头的Content-Typeapplication/json;charset=utf-8,因此,该请求需要首先发起“预检请求”。

预检请求标头

Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: GET
...

实际请求标头

Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
...

Access-Control-Max-Age用于设置预检请求得缓存时间,即对于同一个跨域得复杂请求,不需要每次都发送一次预检请求。

实际的请求不会携带 Access-Control-Request-* 首部,它们仅用于 OPTIONS 请求。

附带身份凭证的请求

一般而言,对于跨域 XMLHttpRequestFetch 请求,浏览器不会发送身份凭证信息。如果要发送凭证信息,需要进行额外设置(同源请求会默认带上Cookie, 当响应中携带Cookie,浏览器会将Cookie进行存储,当请求时携带上去)。

当跨域时,对于XMLHttpRequest对象,需要将实例的withCredentials设置成true,同时服务端也需要设置对应的响应头Access-Control-Allow-Credentials设置成true

node为例

const app = http.createServer((req, res) => {
  res.writeHead(200, {
    "Access-Control-Allow-Origin": "http://localhost:8080",
    "Access-Control-Allow-Credentials": true,
    "Set-Cookie": serialize("name", "leo", "utf8", { maxAge: "6000" }),
  });
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进销存软件对中小型企业管理有什么作用?

进销存软件对中小型企业管理有什么作用? 01 更加有序 库存不乱单据不乱价格不乱 使用进销存软件可以把这些都记录下来,有条不紊,出现什么问题也有据可查,不像纸质单据,会丢会坏,乱成一团。 02 能打印正式…

[Spring Cloud] Hystrix通过配置文件统一设置参数/与OpenFeign结合使用

✨✨个人主页:沫洺的主页 📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专…

网站favion.ico图标

Favicon.ico一般用于作为缩略的网站标志,它显示在浏览器的地址栏或者标签上。 目前主要的浏览器都支持favicon.ico图标 一 制作favicon图标 1 把品优购图标切成png图片 2 把png图片转换为ico图标,这需要借助第三方转换网站,例如&#xff1…

刷题经验分享(一)

文章目录删除公共字符:组队竞赛:删除公共字符: 第一题:删除公共字符 方法一: 思路: 1.将第二个字符串的字符都映射到一个hashtable数组中,用来判断一个字符在这个字符串。 2. 判断一个字符在第…

140.深度学习分布式计算框架-3

140.1 Horovod Horovod是 Uber 开源的又一个深度学习工具,它的发展吸取了 Facebook「一小时训练 ImageNet 论文」与百度 Ring Allreduce 的优点,可为用户实现分布式训练提供帮助。Horovod 支持通过用于高性能并行计算的低层次接口 – 消息传递接口 (MPI…

Vue脚手架环境中简单使用MarkDown(只入门)

目录 入门 高级使用 入门 1 所在终端输入 npm install vue-meditor 2 复制以下代码 先新建一个组件 <template><div><MavonEditor v-model"myMarkDownData"/><button click"submit">提交</button></div> </te…

vue配置

首先安装node.js 在cmd node -v查看 然后 cmd命令行执行 : npm install -g vue/cli // 加-g是安装到全局 安装vue cli 安装vue cli 1 看一下 这是在cmd输入的内容,参考第一条链接 在vscode中怎么配置他? 文件-打开文件夹,选择一个文件夹 这里是firstvue 在下面新建文件夹…

可变长子网划分

目录 IP地址 子网划分 可变长子网划分 IP地址 在学习子网划分之前应该先清楚什么是IP地址和IP地址的类型 IP 地址的格式0网络地址主机地址10网络地址 主机地址 110网络地址主机地址1110组播地址11110保留 A 1.0.0.0~127.255.255.255 B 128.0.0.0~191.255.255…

C++编程进阶

目录 new运算符 new关键字的使用案例 C的引用 C中引用案例 引用的注意事项 引用做函数参数 引用做函数的返回值 前言&#xff1a; 具体案例 引用的本质 常量引用 常量引用原理 经典案例 函数的提高 函数的默认参数 注意&#xff1a; 具体案例 函数的占位参数…

已解决:树莓派外接硬盘 usb 或者sata 导致wifi无法链接 无线网卡无法使用问题

我的环境是树莓派4b 买了一个有硬盘的盒子 看上图的连接方式&#xff0c;是占用了树莓派的一个usb3.1进行了sata的转接&#xff0c;实现挂载硬盘。 但是我发现&#xff0c;安装系统开机之后&#xff0c;可以看到有硬盘接入&#xff0c;但是无法连wifi&#xff0c;如果拔掉硬盘…

G. SlavicG‘s Favorite Problem(树的遍历DFS,BFS均可)

Problem - G - Codeforces 给你一棵有n个顶点的加权树。回顾一下&#xff0c;树是一个没有任何循环的连接图。加权树是一棵树&#xff0c;其中每条边都有一定的权重。这棵树是无定向的&#xff0c;它没有根。 由于树让你感到厌烦&#xff0c;你决定挑战自己&#xff0c;在给定…

java--Lambda (3)变量的访问与修改

文章目录0 写在前面1 可以直接在 Lambda 表达式中访问外层的局部变量2 在 Lambda 表达式当中被引用的变量的值不可以被更改3 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量4 写在最后0 写在前面 学习使用在Lambda表达式&#xff0c;有些地方访问一些变…

VM系列振弦读数模块采集测量数据的一般步骤

VM 模块是通用型单振弦式传感器测量模块&#xff0c;主要功能是测量频率的传感器内置的温度传感器&#xff0c;使用默认工作参数即可自动测读绝大多数振弦传感器。 但由于传感器类型、结构、厂家、钢弦材料、线圈等影响因素不同&#xff0c;导致使用 VM 模块测量某些传感器时需…

【408专项篇】C语言笔记-第六章(指针)

文章目录第一节&#xff1a;指针的本质1. 指针的定义2. 取地址操作符与取值操作符第二节&#xff1a;指针的传递1. 指针的传递第三节&#xff1a;指针的偏移1. 指针的偏移2. 指针与一维数组第四节&#xff1a;动态指针与内存申请1. 指针与动态内存申请2. 堆空间和栈空间的差异第…

电脑无线网卡连接的无线信号不好的,经常丢包,掉线断网如何优化解决

环境&#xff1a; 电脑&#xff1a;HP480G7 系统:Win10 专业版 无线网卡&#xff1a;水星ud6s 、TP-LINK等 AP&#xff1a;锐捷RAP2200(E) 组网模式&#xff1a;AP代管AP模式 问题描述&#xff1a; 电脑无线网卡连接的无线信号不好的&#xff0c;经常断网&#xff0c;因…

docker logs命令详解

docker 命令官档如下&#xff1a; https://docs.docker.com/engine/reference/commandline/docker/ docker logs官档如下 https://docs.docker.com/engine/reference/commandline/logs/#retrieve-logs-until-a-specific-point-in-time 一、常用命令 1. 可以查看命令用法 doc…

英国访问学者|签证申请详细步骤简述

英国访问学者签证流程是怎么样的&#xff1f;下面就随知识人网老师一起来看一看英国访问学者签证申请详细步骤简述。 第1步&#xff1a;英国签证申请中心只接受在线填写的申请表&#xff0c;不接受手写表格。请访问官网完整填写申请表。(必须使用英文大写填写) 第2步&#xff…

数据库系统 整体结构化 的理解

数据库系统实现整体数据的结构化&#xff0c;这是数据库的主要特征之一&#xff0c;也是数据库系统与文件系统的本质区别。 在文件系统中&#xff0c;文件中的记录内部具有结构&#xff0c;但是记录的结构和记录之间的联系被固化在程序中&#xff0c;需要由程序员加以维…

jenkins配置maven+git自动构建jar包

进入页面 安装maven插件 需要使用maven插件构建项目,所以安装maven插件 步骤如下图&#xff1a; 点击安装后跳转至安装页面&#xff0c;等待在线安装完成即可 安装完成配置当前服务器中安装的maven 下滑到最下面点击新增maven 配置完成点击应用完成 配置当前服务器中安装的gi…

ADB 命令结合 Monkey 的使用

1、什么是monkey Monkey 是Android SDK提供的一个命令行工具&#xff0c;可以简单方便的发送伪随机的用户事件流&#xff0c;对Android APP做压力&#xff08;稳定性&#xff09;测试。主要是为了测试app是否存在无响应和崩溃的情况。 2、adb结合 monkey 的常用命令 adb shel…