Difference between AJAX request and a regular browser request
Ajax请求和直接浏览器请求之间有区别吗(就如何调用和加载网页而言)?
换句话说,我的意思是:直接服务器端请求的处理方式与客户端请求(由浏览器启动)有什么不同吗?
可能存在一些头差异,但主要的行为差异在客户机上。
当浏览器像
对于Ajax请求,当前窗口/文档不受影响,JavaScript代码可以检查请求的结果,并对这些结果执行它想要的操作(动态地将HTML插入页面,解析JSON并使用页面逻辑、解析XML等)。
服务器没有做任何不同的事情——它只是客户机处理来自两个请求的响应的方式。
就服务器而言,Ajax请求与"普通"浏览器请求相同,但HTTP头可能略有不同。例如,Chrome发送:
1 | X-Requested-With:XMLHttpRequest |
我不确定这个标题是否标准化,或者它在每个浏览器中是否不同,甚至包括在每个浏览器中。
编辑:我收回它,该头是由jquery(以及其他可能的JS库)发送的,而不是由以下内容证明的浏览器:
2发送:
1 2 3 4 5 6 7 8 9 10 | Accept:*/* Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 Accept-Encoding:gzip,deflate,sdch Accept-Language:en-US,en;q=0.8 Connection:keep-alive Cookie: .... Host:stackoverflow.com If-Modified-Since:Sat, 31 Dec 2011 01:57:24 GMT Referer:http://stackoverflow.com/questions/8685750/how-does-an-ajax-request-differ-from-a-normal-browser-request/8685758 User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11 |
这让我得出了这样的结论:默认情况下没有任何区别。
一些流行的客户端库(如jquery)在其请求中包含
几年前,这似乎被认为是标准的(可能是由于jquery的巨大普及以及它在几乎每个网站上的存在),许多服务器端框架甚至有帮助者负责在收到的请求中检查这个头:
ASP.NET MVC 5:
1 | HttpRequestBase.IsAjaxRequest() |
Django:
1 | HttpRequest.is_ajax() |
瓶:
1 | flask.Request.is_xhr |
然而,似乎随着jquery在前端世界的统治结束,
虽然我相信你们,但在网络逻辑上有一种完全奇怪的想法:我正在使用ExtJS框架编写一个应用程序,它执行Ajax调用。
在进行j_安全性检查时,我总是以ajax方式进行检查时出错:weblogic说:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | unauthorized: var submitButton = new Ext.Button({ text: 'Logon', formBind: true, //only enabled once the form is valid disabled: true, handler: function() { Ext.Ajax.request({ url:"j_security_check", params: { j_username: dlg.getForm().findField('j_username').getValue(), j_password: dlg.getForm().findField('j_password').getValue() }, method:"GET" }); } }); |
这失败了。
当我发布此消息时:
1 | window.location.href="j_security_check?j_username=" + dlg.getForm().findField('j_username').getValue() +"&j_password=" + dlg.getForm().findField('j_password').getValue(); |
它起作用了!奇怪的。
不是真的。除了大多数Ajax客户机发送一个
您的用户代理,也就是浏览器,发送一个xhr头文件,您可以从下面的php中获取:
1 | $_SERVER['HTTP_X_REQUESTED_WITH'] |