判断一个请求是否是 Ajax 异步请求
前言
今天在看项目过程中,发现了一段代码。是用来判断一个请求是否是ajax
请求,出于好奇,我研究了一番。
代码预览
从代码中可以看出主要从四方面校验一个请求是否是ajax
请求。这里主要说一下前两个方面。
测试
Accept
**Accept
** 请求头用来告知(服务器)客户端可以处理的内容类型,这种内容类型用MIME类型](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Type) 应答头通知客户端它的选择。浏览器会基于请求的上下文来为这个请求头设置合适的值,比如获取一个
模拟测试
下面我模拟两种请求:
浏览器访问:
ajax访问:
通过对比,我们发现在请求头中的确存在代码中用于判断是否是ajax请求的请求头,故方法可行。
不同声音
在慎用X-Requested-With判断是否是Ajax请求这篇文章中,作者提出,jQuery.ajax
在跨越请求下,默认不会设置X-Requested-With头。
进行到这里,为什么ajax
请求会自动带上X-Requested-With
头?,为什么跨越之后,X-Requested-With
会丢失?
很庆幸,我在CSRF Mitigation for AJAX Requests这篇文章中找到了答案,文中提到许多JavaScript框架(例如JQuery
)会自动将此标头与任何AJAX请求一起发送。此标头不能跨域发送,主要目的是为了防止CSRF
攻击。文章写的很详细,大家可以翻墙看看,这里就不粘贴过来了。
结论
经过上面的讨论,我们可以利用accept
和X-Requested-With
头信息来做判断。虽然大部分JavaScript框架会自动加上X-Requested-With
,特殊情况下,还是需要自定义标头。
版权声明: 本文为 InfoQ 作者【麦叔】的原创文章。
原文链接:【http://xie.infoq.cn/article/b6880bae40d1b2db64cd0150b】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论