跨域问题及CORS机制

跨域

跨域是指一个资源请求与其不在同一个域(源)的资源,不在同一个域(源)是指两个域的协议、域名或端口不同。

同源策略

出于安全考虑,浏览器制定了同源策略, 限制了某些跨域请求。同源策略是跨域问题产生的根源。但是,同源策略并没有限制所有的跨域请求,比如浏览器不限制加载嵌在<script>标签中跨域的js文件。

跨域资源共享机制(CORS)

跨域资源共享(CORS)是浏览器提供的一种跨域协商机制,让前后端协商是否可以发出跨域请求。
CORS添加了若干Access-controll-request-xxx 的头,给客户端声明自己的源、要使用的头部、用使用的请求方法;添加了若干Access-Controll-Allow-xxx的头,给服务端声明自己支持跨域的源、头部和方法。
CORS将请求分为简单请求和复杂请求,对于复杂跨域请求,发送真正请求之前要通过预检机制和后端协商。

简单请求

一个简单请求要满足以下所有条件:

  • 只能使用GETHEADPOST请求方法

  • 不得手动设置以下头之外的头

    • Accept
    • Accept-Language
    • Content-Language
    • Content-Type
    • DPR
    • Downlink
    • Save-Data
    • Viewport-Width
    • Width
  • Content-Type只能是下面的一种

    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain

    对于简单请求,后端只需要在返回体里设置相应的Access-controll-Allow-xxx就可以了

复杂请求和预检机制

除了上述简单请求外,其它请求都是复杂请求。对于复杂请求,浏览器会首先使用OPTION方法发送一个预验请求(Preflighted requests)到后端,后端决定是否允许发送该跨域请求,将决定结果返回前端。只有预检通过之后,真实的请求才会发送。流程如下:

这里写图片描述

(图片来自:https://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server)

CORS跨域实现

使用CORS机制,需要分清楚是简单请求还是复杂请求,因为复杂跨域请求会触发预检机制。对于简单跨域请求,后端只需要在响应体里返回Access-Controll-Allow就可以了,但是对于复杂请求,则需要实现一个Option方法来返回Access-Controll-Allow,或者将请求调整为一个简单请求。预检整体交互过程如下图所示:

这里写图片描述

一个常见的例子是,在响应里设置了Access-Controll-Allow,然后使用Jquery发送一个跨域POST请求,你会发现没有问题。接着使用 angular resource的save方法发送同样一个跨域请求,你就会发现报错了。这是为什么呢?因为jquery默认使用Content-Type:application/x-www-form-urlencoded,所以它发送的是一个简单请求,但是,因为angular resource 默认使用Content-Type:application/json,所以它发送的是一个复杂请求,这触发了浏览器的预检机制。这时我们手动设置Content-Type:application/x-www-form-urlencoded,或者后端实现一个Option方法,

需要注意的是,改变content-type可能会导致后端解析数据出错,例如content-type:application/x-www-form-urlencoded,参数是以键值对形式保存的,很多后端框架都会做自动解析操作,而content-type: text/plain,参数的形式就不确定了,只能以原始数据流的方式保存(放在PayLoad里面),需要自己解析。详情请看 AJAX POST请求中参数以form data和request payload形式在servlet中的获取方式

参考:Server-Side Access Control (CORS)

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

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

相关文章

【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】...

模拟题&#xff0c;可以用树链剖分线段树维护。 但是学了一个厉害的。。树状数组的区间修改与区间查询。。 分割线里面的是转载的&#xff1a; -------------------------------------------------------------------------------- [ 3 ] 上面都不是重点……重点是树状数组的区…

oracle .dbf文件过大_学习这篇Oracle数据库文件坏块损坏的恢复方法,拓展你的知识面...

一、Oracle数据库系统简介&#xff1a;ORACLE数据库系统是美国ORACLE公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。比如SilverStream就是基于数据库的一种中间…

threejs- z-fighting 问题

Z-Buffer 在threejs中&#xff0c;使用深度缓冲&#xff08;Z-Buffer&#xff09;来完成场景可见性计算&#xff0c;即确定场景哪部分可见&#xff0c;哪部分不可见。深度缓冲&#xff08;Z-Buffer&#xff09;是一个二维数组&#xff0c;其中的每一个元素对应屏幕上的一个像素…

bower overrides 配置

bower 是一个常用的包管理工具&#xff0c;用起来和npm很相似&#xff0c;但是两者又有一些区别&#xff0c;可以参考 —— What is the difference between Bower and npm。这里不说bower本身&#xff0c;而想说一下bower的overrides配置。 何谓override override 本身是覆盖…

windows下搭建Vagrant+Virtualbox环境

对于开发人员来说&#xff0c;Vagrant就是一个提供标准化开发环境的工具。通过Vagrant&#xff1a; 使每个开发人员电脑上的代码运行环境一致&#xff0c;再也不会出现“在我电脑上运行起来明明没有问题的”这样的开发环境不一致的问题。你可以使用Vagrant在windows下提供linu…

Jenkins主从节点配置

jenkins支持主从模式&#xff0c;这将会把构建任务分发到多个从节点去执行&#xff0c;这样就可以支撑起多个项目的大量构建任务&#xff0c;同时&#xff0c;你可以提供多种环境&#xff08;如&#xff1a;开发环境、生产环境&#xff09;来对同一个项目进行测试和构建。想要进…

HTML5 响应式图片

现在上网设备越来越多&#xff0c;各种设备的屏幕千差万别&#xff0c;如果只用一张图片去涵盖所有的设备&#xff0c;一是可能会造成某些设备上显示效果不佳&#xff0c;比如使用了一张低清晰度的图&#xff0c;而网页运行在一个高清大屏里&#xff1b;二是可能会浪费带宽&…

threejs坐标转换

屏幕坐标转three.js坐标 将屏幕坐标转变成threejs空间坐标&#xff1a; function transToThreeCoord(x,y){let mouse new THREE.Vector3();mouse.x (x/window.innerWidth)*2 -1;mouse.y -(y/window.innerHeight)*2 1;return mouse; }注意&#xff1a;在实际使用中&#x…

android socket 发送byte_如何正确地创建和销毁网络通讯程序中的Socket类的对象实例...

软件项目实训及课程设计指导——如何正确地创建和销毁软件应用系统中网络通讯中的Socket类的对象实例1、基于TCP/IP协议的Socket通信相关的基础知识(1)TCP/IP(Transmission Control Protocol传输控制协议/Internet Protocol网间协议)TCP/IP是目前Internet网络中的主要协议&…

H5 使用微信开放标签跳转小程序

微信开放标签是微信公众平台面向网页开发者提供的扩展标签集合&#xff0c;可以在网页上提供跳转小程序、打开 App 等能力。本文梳理使用微信开放标签跳转小程序的过程&#xff0c;以备日后查阅。 参考链接 1. 开放标签说明文档 准备已认证的服务号 开放标签只能绑定已认证…

【网络流24题】No.7 试题库问题 (最大流,二分图多重匹配)

【题意】 假设一个试题库中有 n 道试题。 每道试题都标明了所属类别。 同一道题可能有多个类别属性。现要从题库中抽取 m 道题组成试卷。并要求试卷包含指定类型的试题。 试设计一个满足要求的组卷算法。 输入文件示例input.txt3 153 3 42 1 21 31 31 31 33 1 2 32 2 32 1 31 2…

参数等效模型可以用于_干货分享电池单体产热特性及热模型标定分析(2)

上篇已讲解了电池单体产热特性及电池模型相关理论&#xff0c;相较之下等效电路模型无需对电池内部的电化学反应有着深入的分析&#xff0c;是通过电路来描述电池的开路电压、内阻等&#xff0c;以实现对电池外特性的表征。本篇将继续讨论此问题&#xff0c;用Matlab和Amesim模…

检测同心圆_(二)光线如何被眼睛检测到?

在第一篇文章中&#xff08;链接&#xff1a;&#xff08;一&#xff09;视觉系统的全貌&#xff09;&#xff0c;我们已经了解了视觉信息被大脑处理的全过程。现在&#xff0c;我们把目光投向一切的起点——眼睛。实际上&#xff0c;人们提起“视觉”&#xff0c;首先想到的几…

matlab计算斜方差_计算一幅图像的信噪比

本文摘自本人的毕业设计《数字图像滤波算法研究》2019, Chang’an University, Xi’an, China.本文适用于原始图像&#xff08;即不含噪声的图像&#xff09;存在的情况下。使用待计算SNR图像&#xff08;记为A&#xff09;与原始图像&#xff08;记为B&#xff09;做相减运算&…

【转载】linux进程及进程控制

Linux进程控制 程序是一组可执行的静态指令集&#xff0c;而进程(process)是一个执行中的程序实例。利用分时技术&#xff0c;在Linux操作系统上同时可以运行多个进程。分时技术的基本原理是把CPU的运行时间划分成一个个规定长度的时间片&#xff0c;让每个进程在一个时间片内运…

区分大小屏幕_VESA持续推动DisplayHDR认证计划,你的屏幕属于何种等级吗?

美国视频电子标准协会(VESA)今年可说是动作频频&#xff0c;年初先发布了专为OLED与其他自发光显示器所制订的DisplayHDR True Black高动态范围标准&#xff0c;下半年则更新DisplayHDR兼容测试规范至1.1版&#xff0c;并发布新的DisplayHDR 1400性能分级&#xff0c;至于年中所…

cordova 某个页面强制横屏_小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?...

老刘 1前言这篇文章是应网友之邀所写&#xff0c;主要描述一下我们访问网站时&#xff0c; 从输入网址到最后浏览器呈现内容&#xff0c;中间发生了什么。今天的文章主要专注于应用层&#xff0c;我拿了一个很简单的网络结构来讲。假定本机已经获取了IP地址&#xff0c;各种网络…

vue调用手机相机相册_今天才发现,点一下小米手机相册,能将照片一键制作成电影...

随着国产手机的发展&#xff0c;手机像素越来越高&#xff0c;里面的功能也越来越丰富&#xff0c;手机拍照成了不少人的日常&#xff0c;如果你很爱拍照&#xff0c;手机里有一大堆照片&#xff0c;那么教你用手机自带的相册功能&#xff0c;一键将照片制作成电影&#xff0c;…

unity 烘焙参数 设置_Unity通用渲染管线(URP)系列(九)——点光源和聚光灯

200篇教程总入口&#xff0c;欢迎收藏&#xff1a;放牛的星星&#xff1a;[教程汇总持续更新]Unity从入门到入坟——收藏这一篇就够了​zhuanlan.zhihu.com本文重点内容&#xff1a;1、支持更多类型的灯光2、包含实时的点光源和聚光灯3、为点光源和聚光灯烘焙阴影4、每个物体限…

c#日期转换周几_Java时间与日期

只有把眼前的事情做好&#xff0c;才能考虑其他的问题。众所周知&#xff0c;全世界在同一时刻看手表肯定不会看到同一个时间&#xff0c;因为地球是圆的&#xff0c;面对太阳的角度是不一样的&#xff0c;我们一般说时间几点几点&#xff0c;是指的本地时间&#xff0c;比如国…