Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

如何判断请求是 XHR 发起的还是页面请求?

  翻阅一些别人写的旧代码的时候经常看到使用 X-Requested-With 这个请求头来判断一个请求是否是来自 XHR 的。很多 Ajax 封装默认确实会设置这个头。然而这个头并不是 XHR 的标配,所以不应该通过它来判断。而且前端设置请求头在 CORS 时还可能遇到问题。
  既然 X-Requested-With 是个坑,那应该如何判断?其实,每个不同目的的请求,其请求头的 Accept 字段都是不同的。比如一个对 HTML 页面的请求,那么它预期的就是一个 HTML 页面,于是 Accept 中就应该会包含 text/html 之类的字样。通过这个我们就可以判断出一个请求是否来自页面请求。
   对于 XHR 对象发起的请求,浏览器通常不知道程序到底想干嘛,所以它的 Accept 通常只有 */*,表示期望接收任何类型的数据。所以也可以通过它来判断一个来自 XHR 对象的请求。
   除了这些外,我们还有更多的渠道去发起一个资源的请求。比如使用 IMG 元素来请求图片,那么它的 Accept 中设置的一定是其期望的图片类型 image/*,而如果是引入脚本文件,那么则可能是 application/javascript 之类的。
  通过 Accept 来选择性地为不同请求来源输出不同内容是不错的做法,至少比 X-Requested-With 这种东西要靠谱。在前端发起请求时应该尽可能地少对 XHR 对象做一些奇怪的操作。比如想调用 setRequestHeader 来设置请求头的话,CSRS 的请求就需要服务器端提供 Access-Control-Allow-Headers 的支持,这会变得非常麻烦。
  另外使用 Accept 也更语义化,比如客户端告诉服务器自己期望接收一个 HTML,那么服务器就输出一个 HTML。这个语义明显要比判断一个奇怪的自定义头字段来输出不同的内容要强得多。
  当然 Accept 也有一些坑,比如它并没有绝对的标准。不同浏览器上,各种操作提供的 Accept 可能不同。如果真使用 Accept,还得把需要兼容的浏览器都考虑上。
网名:
54.211.148.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^