问题

为什么跨域的post请求区分为简单请求和非简单请求和content-type相关?

回答
你这个问题问得很有意思,触及到了浏览器安全机制的核心。为什么我们进行跨域 POST 请求时,会冒出“简单请求”和“非简单请求”这么一个说法,而且这区分还和 `ContentType` 紧密相关?这背后其实是为了平衡 Web 应用的便利性和用户数据的安全。

想象一下,我们日常上网,经常会通过一个网站(比如新闻网站)的表单提交信息,或者通过一个用户界面调用另一个服务来完成某个操作。如果所有的跨域请求都像同源请求一样畅通无阻,那我们的浏览器将会成为一个巨大的安全隐患。恶意网站可以轻易地伪造我们的请求,访问我们授权给其他网站的敏感信息,或者执行我们不希望的操作。

为了防止这种情况,浏览器引入了“同源策略”(SameOrigin Policy)。简单来说,就是浏览器限制了一个源(协议、域名、端口)的文档或脚本,去访问另一个源的资源。当我们尝试跨越这个“源”的边界,去向另一个域发送请求时,浏览器就会介入,进行一层检查,这就是所谓的“跨域请求”。

但是,如果把所有跨域请求都一概而论地严格限制,那很多合法的 Web 应用就没法正常工作了。比如,我们可能需要在自己的前端页面上,从一个 CDN(内容分发网络)加载图片或脚本,或者调用一个专门的数据服务 API。这就需要一种机制,既能提供必要的安全保障,又能允许一些“安全”的跨域交互。

于是,就有了我们现在谈论的“预检请求”(Preflight Request)和“简单请求”的概念。

简单请求(Simple Request)

浏览器之所以把一部分跨域 POST 请求称为“简单请求”,是因为这些请求相对而言更“简单”,对服务器来说,它们更像是“可预期”的,并且不容易被滥用。

要被归类为简单请求,一个跨域请求需要满足几个硬性条件:

1. HTTP 方法限制: 只能是 `GET`、`HEAD` 或者 `POST`。我们关注的是 POST,所以 `POST` 是允许的。
2. `ContentType` 的限制: 这是你问题中提到的关键点。如果你的 POST 请求带有 `ContentType` 请求头,那么它必须是以下三种值之一:
`application/xwwwformurlencoded`:这是最原始的 HTML 表单提交数据的方式,数据会以 `key=value&key=value` 的格式编码。
`multipart/formdata`:用于提交文件,比如文件上传。
`text/plain`:纯文本格式。

为什么是这三种?这是因为这些 `ContentType` 在 HTTP 协议的早期就已经存在,并且它们的数据格式比较标准化,浏览器在解析和处理这些数据时,不会遇到太多复杂性,而且它们通常不会包含执行恶意代码的风险。

举个例子,如果你用 `application/xwwwformurlencoded` 来发送一个 POST 请求,比如提交一个用户名和密码,浏览器就会认为这是一个“简单请求”。在这种情况下,浏览器会直接发送这个 POST 请求到目标服务器,而不需要做任何额外的“检查”。服务器收到这个请求后,就像处理同源请求一样处理它。

非简单请求(NonSimple Request)

与之相对,那些不满足“简单请求”条件的跨域 POST 请求,就被浏览器视为“非简单请求”。

这通常发生在以下几种情况(依然以 POST 为例):

1. 使用了非 `GET`、`HEAD`、`POST` 的 HTTP 方法: 比如 `PUT`、`DELETE`、`OPTIONS`、`PATCH` 等。这些方法往往用于更复杂的资源操作,浏览器需要更谨慎。
2. `ContentType` 不是上述三种允许的值: 这是最常见也最关键的原因。比如,你可能想以 `application/json` 的格式发送数据,这是现代 Web API 非常普遍的格式。或者你发送的是 `application/xml`,或者自定义的 `ContentType`。

当你的 POST 请求的 `ContentType` 是 `application/json` 时,浏览器就不会直接发送这个请求。为什么?因为 `application/json` 是一种更灵活的格式,它允许发送更复杂、结构化的数据,理论上,如果服务器处理不当,这些数据中可能包含一些浏览器不想让恶意页面执行的东西。

为了应对这种情况,浏览器引入了一个安全机制:预检请求(Preflight Request)。

在发送实际的 POST 请求之前,浏览器会先使用 `OPTIONS` 方法,向目标服务器发送一个“预检请求”。这个预检请求会携带一些特殊的请求头,其中最重要的就是 `AccessControlRequestMethod`(表明你实际想使用的 HTTP 方法,比如 `POST`)和 `AccessControlRequestHeaders`(表明你打算在实际请求中发送哪些自定义请求头,其中也包含了 `ContentType` 的值)。

服务器收到这个预检请求后,会根据这些信息来判断,是否允许来自当前这个“源”的这个特定请求。如果服务器认为允许,它会在响应中返回一些特殊的响应头,比如 `AccessControlAllowOrigin`(允许的来源)、`AccessControlAllowMethods`(允许的方法)和 `AccessControlAllowHeaders`(允许的请求头)。

如果服务器的响应表明允许,浏览器才会接着发送我们原本想要发送的那个“非简单”的 POST 请求。如果服务器不允许,或者没有返回相应的允许头,那么浏览器就会阻止这个请求,并在开发者控制台中抛出错误,告诉你跨域请求被拒绝了。

总结一下 `ContentType` 的重要性:

`ContentType` 之所以是区分简单请求和非简单请求的关键,是因为它直接影响到浏览器对请求安全性的判断。

简单请求的 `ContentType`(`application/xwwwformurlencoded`, `multipart/formdata`, `text/plain`)被认为是“低风险”的。它们的数据格式相对固定,不容易被注入恶意脚本,或者被滥用来发送大量不必要的复杂数据。因此,浏览器允许直接发送,无需预检。
非简单请求的 `ContentType`(如 `application/json` 等)则被认为可能包含更复杂的数据结构,需要服务器端有明确的允许策略。通过预检机制,浏览器可以确保服务器端明确同意接收这种类型的跨域请求,从而增加了安全性。

所以,这种区分并不是凭空捏造,而是浏览器为了在开放的 Web 环境中,保护用户数据不被恶意网站窃取或滥用而设计的一套精细的安全策略。简单请求就是一种“信任度较高”,可以直接放行的类型,而非简单请求则需要经过服务器的“身份验证”和“授权”——也就是预检请求。

网友意见

user avatar

如果我们现在重新设计整个HTTP协议,我们可以要求浏览器在发送任何数据到另外一个域的服务器之前,都必须先发送preflight request。但是大部分现存网站并未针对preflight request做出实现,所以这意味着现有的互联网中,如果一个域的表单向另一个域提交的时候会跨域失败,直到目标网站更新处理perflight request为止。


所以在我们制定这一新的标准的时候,应当考虑到目前互联网已经存在这样的请求,他们虽然看起来可能不安全,但为了向下兼容,我们不能强制对这些请求做preflight request。既然不能强制做preflight request验证,那发这个东西就没有什么意义了。




当然,我认为在时机成熟的时候,我们可以引入一种强制CORS的机制,就像现在的强制HTTPS机制一样。我们可以约定浏览器预先发一个请求到目标域名确定目标域的服务器是否支持强制CORS。如果目标域支持强制CORS,则浏览器对引用目标域的任何资源请求都发出Origin头,任何数据的发送都先发送preflight request。



至于你的迷惑,简单来说:

CORS是允许受限的跨域访问,不是限制现有的跨域访问。



没有CORS之前我们不是不可以跨域访问,而是要很弯弯绕(譬如说JSONP和万能的服务器代发),而CORS则是提出一个方案可以让我们直接了当的描述跨域访问的需求并且加以控制。

类似的话题

  • 回答
    你这个问题问得很有意思,触及到了浏览器安全机制的核心。为什么我们进行跨域 POST 请求时,会冒出“简单请求”和“非简单请求”这么一个说法,而且这区分还和 `ContentType` 紧密相关?这背后其实是为了平衡 Web 应用的便利性和用户数据的安全。想象一下,我们日常上网,经常会通过一个网站(比.............
  • 回答
    你好!很高兴能为你解答关于抽象代数中分裂域的问题。这个问题涉及到域扩张、多项式根以及群论中的对称群,是抽象代数中一个非常重要且有趣的概念。我们来一步步地、详细地剖析这个问题。 核心概念梳理在深入讲解之前,我们先明确几个核心概念:1. 域 (Field, F):一个包含加法和乘法运算,并且这些运算满.............
  • 回答
    关于“三体”中的“黑域”,它并非一个物理上的绝对安全区域,而是一种基于对宇宙生存法则理解而采取的策略性规避手段。理解黑域的安全本质,需要深入剖析《三体》系列所构建的宇宙图景,尤其是其核心概念——“黑暗森林法则”。首先,我们要明白,在“三体”的宇宙中,生存是文明的首要目标。而宇宙并非一个和谐美好的地方.............
  • 回答
    网上看到的中古汉语拟音朗读,调域普遍偏窄偏低,这确实是一个普遍现象,背后有几个主要原因,而且这些原因相互关联,共同造就了我们听到的“中古汉语之声”。首先,我们得明白,网上流传的很多中古汉语拟音,尤其是那些作为教学辅助或者普及性内容的,其实是基于研究者的推测和复原。中古汉语本身已经失传了,我们今天听到.............
  • 回答
    理解这个问题,我们需要先明确几个关键概念:有限域、多项式以及根(解)。1. 有限域是什么?想象一下,我们日常生活中用的数字是无限的,比如整数、实数等等。而有限域,顾名思义,它是一个“小小的”、只有有限多个元素的数字系统。在这个系统里,加法、减法、乘法、除法(除了除以零)都跟我们熟悉的运算一样,但结果.............
  • 回答
    你提出的问题非常有趣,触及了数学中关于数系封闭性与无穷表示之间的微妙关系。我来尽量详细地为你剖析一下,希望能让你对这个问题有更清晰的认识。首先,我们得明确一下你提到的核心概念: 有理数域 (ℚ) 的封闭性: 这是指对有理数进行加法、减法、乘法和除法(除数不为零)运算后,结果仍然是有理数。这就像一.............
  • 回答
    要说《刀剑神域》(SAO)这片子平庸,估计不少核心粉丝得炸毛了。但话糙理不糙,很多观众,包括我,都会在某个点上觉得,它好像并没有达到那个声名鹊起的程度,或者说,它的优秀之处并没有那么“贯穿始终”。可偏偏就是这么一部作品,火得一塌糊涂,甚至可以说是一代人的ACG启蒙之一。这背后到底有什么样的魔法?咱们.............
  • 回答
    这确实是一个很有趣的问题,也是很多初学前端开发者容易混淆的地方。要理解这一点,我们需要深入到浏览器同源策略的本质以及不同提交方式在处理网络请求时的区别。首先,我们要明确一点:并非所有的 `form` 表单提交都没有跨域问题。 严格来说,是浏览器为了安全考虑,对跨域请求设置了限制,而 `form` 表.............
  • 回答
    “老师,我又连不上服务器了!”“我的机子好像又掉线了。”“屏幕上还是空白的,老师您那里看到我了吗?”……这样的对话,相信不少在用极域电子教室的学生们都耳熟能详,甚至都已经成为了一种“日常”。明明按照老师的指示操作了,可电脑屏幕上就是没有教师机的画面,或者连接服务器的时候一直提示失败,最终只能是自家电.............
  • 回答
    话说这年头,但凡有点名堂的品牌,都在卯足了劲儿往“私域流量”里钻。您可能得问了,这“私域流量”到底是个啥?为啥突然就成了香饽饽,让大伙儿趋之若鹜?这背后,可不单单是跟风,而是有几把真真切切的“火”在烧。首先,得说说那消失的“公域红利”。您想想,早些年,互联网上哪哪都是蓝海。开个淘宝店,稍微会点推广,.............
  • 回答
    问到点子上了!你这个问题问得特别实在,很多人都有同样的疑惑。确实,在动辄“高色域”、“100% sRGB”甚至“P3色域”满天飞的笔记本市场,ThinkPad很多型号,尤其是那些定位商务、强调稳定耐用和长续航的机型,却依然“固执”地使用着色域覆盖率相对较低的屏幕。这背后原因挺复杂的,并不是简单的偷工.............
  • 回答
    这问题的根源,其实藏在“群”这个字本身所承载的丰富含义里,以及QQ这款产品早期诞生的那个时代背景下。我们一个个来剥开来看。首先,得聊聊“群”字。“群”这个字,在中国文字里,自带一种天然的“聚集”和“共同”的属性。你可以想象一下,一群羊、一群人、一群鸟,它们都是多个个体为了某种目的、某种联系而聚集在一.............
  • 回答
    这个问题很有意思,也触及了跨性别群体中一个常见的观察现象。如果问为什么“跨性别者多是跨性别女性”,这里面的“多”是个关键。我们确实在媒体报道、研究数据以及日常生活中,接触到的跨性别者中,跨性别女性似乎比例更高一些。但要理解这一点,我们需要先澄清几个概念,并且避免一概而论。首先,我们需要明确“跨性别者.............
  • 回答
    在泰国,跨性别者的身影随处可见,这在很大程度上塑造了泰国社会多元而包容的形象。要理解为何泰国会有如此多的跨性别者,我们需要深入探究其历史、文化和社会因素的交织作用。泰国文化自古以来就对性别认同持有一种相对开放的态度。不同于许多西方文化中严格的二元性别划分,泰国传统社会更倾向于接受和理解个体在性别表达.............
  • 回答
    说句实在话,身边不少跨性别朋友,聊起“跨性别者”这个标签,常常伴随着一种天然的滤镜——就是觉得我们都盼望着手术,好像那是什么终极目标、唯一的解药一样。但你我都知道,生活远比这复杂得多,跨性别这件事更是如此。很多人,包括我自己,对手术的态度,真的挺微妙的,远没有外界想象的那么“必须”或者“渴望”。我接.............
  • 回答
    你这个问题问得很有意思,而且很直观。我们平时坐地铁,最深的感受就是“换乘”。你从这条线坐到另一条线,得下车,走一段换乘通道,再进另一条线的站台,上车。为什么不能像公交车那样,直接开到另一条线的轨道上,像变魔术一样就换了车厢呢?其实,这背后牵扯到很多关键的技术和设计上的考虑,让跨线直达变得异常复杂,甚.............
  • 回答
    迪路兽的进化,特别是从它最初形态到天女兽(Angewomon)这一阶段,之所以能呈现出跨越极大界限的“跨物种”特征,其实是数码世界独有的逻辑和设定在起作用,而非我们现实世界生物学意义上的进化。下面我们就来仔细掰扯掰扯这其中的道道。首先,得明白一个基本概念:数码世界不是现实世界。 现实世界的生物进化是.............
  • 回答
    金庸读者喜欢跨书比武,这背后其实藏着一种复杂而有趣的情感需求,是读者对书中世界和人物深深着迷的自然延伸。我试着从几个角度掰扯掰扯,希望能说得细致点,也尽量避免那种“一本正经胡说八道”的AI腔调。首先,咱们得承认,金庸先生笔下的武侠世界太精彩了,太有吸引力了。那些刀光剑影、恩怨情仇,那些绝世武功、侠肝.............
  • 回答
    你的困惑我完全能理解,而且很想和你好好聊聊。当自己心里有个强烈的愿望,想要去追求一个与众不同的道路时,身边人的反对声确实会让人心生动摇,甚至感到孤立。特别是“跨考外哲”,这几个字本身就带着一些“不寻常”的标签,所以大家觉得难以理解,甚至觉得你在“折腾”,也是很正常的反应。我们来好好剖析一下,为什么大.............
  • 回答
    要说小米公司的形象“拉跨”,这可不是一两句话就能说清楚的,里面涉及的点很多,得掰开了揉碎了聊。很多人对小米的印象,就像你说的,感觉有点“拉跨”,这背后其实是多种因素交织的结果。1. 品牌定位的摇摆与不清晰刚起家的时候,小米以“性价比”打天下,价格屠夫的形象深入人心。这确实让它快速获得了大量的用户,尤.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有