axios中默认没加'X-Requested-With': 'XMLHttpRequest',默认就不异步ajax请求的意思吗?

发布于 2022-09-12 03:47:47 字数 253 浏览 14 评论 0

'X-Requested-With': 'XMLHttpRequest',这句代码看网上说是区分是ajax异步请求,还是传统同步请求;
感觉没有理解这里的ajax异步请求和传统同步请求的意思?
在使用过程中,没有跨域的时候,axios配置这个没有'X-Requested-With': 'XMLHttpRequest',我们的异步请求没有什么问题啊?但是出现跨域问题时,则需要把这个加上才可以。。。
有大神能帮忙理一下吗?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

深海里的那抹蓝 2022-09-19 03:47:47

胡说八道,
image.png

无远思近则忧 2022-09-19 03:47:47

哪个文章里写的啊?胡说八道,可以直接拉黑不用再看了,误人子弟呢这不是。

这是区分是 AJAX 请求还是普通的请求(一般指表单提交)的。

AJAX 是 AJAX,跨域是跨域。这也没有关系啊?

AJAX 请求自动浏览器会自动加上这个标头,不用你手动设置,你也去不掉。

至于你请求跨域了,那你应该搜的是跨域的解决方案啊(没有纯前端的解决方案,都需要后端参与)。

还给你自由 2022-09-19 03:47:47

异步和同步? 同步会挂起浏览器,这个时候你点击页面是没有反应的,而且你不需要使用回调,直接就能在后面获取到值。

跨域是跨域的问题

  1. jsonp
  2. cors
  3. nginx代理

更新时间:2020年11月18日15:47:02
看了一下,楼下一兄弟(Myth)的回答,我觉得我得更新一下我的答案。

我要说一个概念,同步与异步。

同步是指,浏览器会挂起进程,等待 ajax 返回,然后继续往后走。
异步是指,浏览器不会等待 ajax 返回,直接往后走,回调被放入了队列里,等待合适的机会。

针对于上面的概念,你的第二条是有问题。因为对于 ajax 的异步和同步来说, 都应该返回403,而不是返回跳转命令
那么什么情况下需要你说的这个功能? 网页跳转情况 需要跳转命令。
所以说,他本质上来讲,还是用来区分是否为 ajax (XMLHttpRequest) 提交的请求。这里你会问了,还有什么其他的提交请求?比如说表单提交,a 标签跳转,iframe 呀。

接下来是第三条,我认为是安全无关。你下面地址指向的其实是跨域预检的问题,主要是对于你的复杂请求,浏览器先去服务端判断一下是否支持,在明确支持的情况下才会去真实请求。

言归正传,我们来总结一下。欢迎补充

对于题主提出的两个概念

  • ajax异步请求

    • fetch
    • XMLHttpRequest (ajax)

      • axios 本质还是 XMLHttpRequest
      • $.ajax 本质还是 XMLHttpRequest
    • new ActiveXObject("Microsoft.XMLHTTP"); 快让 IE 低版本下岗吧
  • 同步请求

    • iframe
    • a
    • 表单提交
    • 直接访问页面
    • script
    • link
    • img
草莓味的萝莉 2022-09-19 03:47:47

我也有这个疑问,同样是对xhr的封装,ajax就会加上这个请求头,而axios就没有。我的猜想就是服务端可以根据这个请求头来判断请求是否来自ajax请求,但是异步和同步与这个请求头是没有任何关系的。跨域与这个请求头没有关系,只需要在服务端配置允许跨域就好了(我使用的时候反正是没毛病的)。

最好是你 2022-09-19 03:47:47

2020-11-19 补充:

有个兄弟@linong 对我这个回答报有疑问,可能是视角不同:
先一句话解释下
X-Requested-With: XMLHttpRequest 是给服务器用的
后面的回答全部是服务器视角,包括后面说的安全问题,均是服务器端打通的视角,从前端视角是没有什么问题的。

XMLHttpRequest是浏览器用的,此方面的疑问,请参考 @linong 的回答

X-Requested-With: XMLHttpRequest 和 XMLHttpRequest 没有必然联系,请分别理解


原回答:

1.这个头的功能是什么

X-Requested-With: XMLHttpRequest 只是用于"标识"是异步的
但是不是真的异步,与它没有一点关系,只是一个"标识"
意思是:不加这个头,浏览器的请求也可以是异步的;加了这个头,也可以是同步的
只是为了通知 服务器,这个请求是异步的,是给服务器用的
即使它是一个同步的请求,你只要加上了这个,就会"伪装"成异步,服务器就会理解为异步

同样 它与 XMLHttpRequest 也没有必然联系
axios通过 XMLHttpRequest发请求给服务器,可以不加 X-Requested-With: XMLHttpRequest这个标识,也确实没有加

2. 为什么么要告知服务器,是不是异步?

对于部分请求,同步和异步的处理方式是不一样的:
比如,访问一个页面,如果没有权限,对于同步的请求,服务器会返回跳转命令
而对于异步请求,服务器可能仅返回一个403,不需要跳转

3. 那Axios明明是异步请求库,为什么不加这个头?

这个就牵扯到问题中说的跨域了
见: https://github.com/axios/axio...
大概就是说:
因为异步请求服务器的处理会有不同,而当它和其它跨域请求混在一起的时候,安全性比较难保证,有风险

所以就干脆默认不提供了
但是呢,你可以手动自己配置,出了安全问题别来找我
配置方法:
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

详情见
https://developer.mozilla.org...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文