axios中默认没加'X-Requested-With': 'XMLHttpRequest',默认就不异步ajax请求的意思吗?
'X-Requested-With': 'XMLHttpRequest',
这句代码看网上说是区分是ajax异步请求,还是传统同步请求;
感觉没有理解这里的ajax异步请求和传统同步请求的意思?
在使用过程中,没有跨域的时候,axios配置这个没有'X-Requested-With': 'XMLHttpRequest',
我们的异步请求没有什么问题啊?但是出现跨域问题时,则需要把这个加上才可以。。。
有大神能帮忙理一下吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
胡说八道,
哪个文章里写的啊?胡说八道,可以直接拉黑不用再看了,误人子弟呢这不是。
这是区分是 AJAX 请求还是普通的请求(一般指表单提交)的。
AJAX 是 AJAX,跨域是跨域。这也没有关系啊?
AJAX 请求自动浏览器会自动加上这个标头,不用你手动设置,你也去不掉。
至于你请求跨域了,那你应该搜的是跨域的解决方案啊(没有纯前端的解决方案,都需要后端参与)。
异步和同步? 同步会挂起浏览器,这个时候你点击页面是没有反应的,而且你不需要使用回调,直接就能在后面获取到值。
跨域是跨域的问题
更新时间:2020年11月18日15:47:02
看了一下,楼下一兄弟(Myth)的回答,我觉得我得更新一下我的答案。
我要说一个概念,同步与异步。
同步是指,浏览器会挂起进程,等待 ajax 返回,然后继续往后走。
异步是指,浏览器不会等待 ajax 返回,直接往后走,回调被放入了队列里,等待合适的机会。
针对于上面的概念,你的第二条是有问题。因为对于 ajax 的异步和同步来说, 都应该返回403,而不是返回跳转命令 。
那么什么情况下需要你说的这个功能? 网页跳转情况 需要跳转命令。
所以说,他本质上来讲,还是用来区分是否为 ajax (XMLHttpRequest) 提交的请求。这里你会问了,还有什么其他的提交请求?比如说表单提交,a 标签跳转,iframe 呀。
接下来是第三条,我认为是安全无关。你下面地址指向的其实是跨域预检的问题,主要是对于你的复杂请求,浏览器先去服务端判断一下是否支持,在明确支持的情况下才会去真实请求。
言归正传,我们来总结一下。欢迎补充
对于题主提出的两个概念
ajax异步请求
XMLHttpRequest (ajax)
同步请求
我也有这个疑问,同样是对xhr的封装,ajax就会加上这个请求头,而axios就没有。我的猜想就是服务端可以根据这个请求头来判断请求是否来自ajax请求,但是异步和同步与这个请求头是没有任何关系的。跨域与这个请求头没有关系,只需要在服务端配置允许跨域就好了(我使用的时候反正是没毛病的)。
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...