AJAX请求和直接浏览器请求之间是否存在差异(就如何调用和加载网页而言)?
换句话说,我的意思是:是否以与客户端请求(由浏览器发起)不同的方式处理直接服务器端请求?
答案 0 :(得分:29)
可能存在一些标题差异,但主要行为差异在于客户端。
当浏览器发出window.location.href = "index.html"
中的常规请求时,它会清除当前窗口并将服务器响应加载到窗口中。
使用ajax请求,当前窗口/文档不受影响,javascript代码可以检查请求的结果并按照这些结果执行它想要的操作(将HTML动态插入页面,解析JSON并使用页面逻辑,解析XML等...)。
服务器没有做任何不同的事情 - 它只是客户端如何处理来自这两个请求的响应。
答案 1 :(得分:24)
就服务器而言,AJAX请求与“正常”浏览器请求相同,而不是可能略有不同的HTTP标头。例如chrome发送:
X-Requested-With:XMLHttpRequest
我不确定该标头是否标准化,或者是否在每个浏览器中都有所不同,甚至在每个浏览器中都包含 。
编辑:我把它拿回来,那个标题是由jQuery(可能还有其他JS库)发送的,而不是浏览器,如下所示:
var xhr = new XMLHttpRequest();
xhr.open('GET', '/');
xhr.send();
发送:
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
这使我得出的结论是默认绝对没有区别。
答案 2 :(得分:0)
不是真的。除了大多数Ajax客户端发送X-Requested-With=XMLHttpRequest
HTTP标头
答案 3 :(得分:0)
虽然我相信你们,但是在weblogic上有一些非常奇怪的东西: 我正在使用ExtJS框架编写一个应用程序,它执行AJAX调用。
在执行j_security_check时,我总是在使用AJAX方式时遇到错误:Weblogic说:
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"
});
}
});
这失败了。
当我发出这个:
window.location.href = "j_security_check?j_username=" + dlg.getForm().findField('j_username').getValue() + "&j_password=" + dlg.getForm().findField('j_password').getValue();
有效!怪异。
答案 4 :(得分:0)
一些流行的客户端库(例如jQuery)在其请求中包含X-Requested-With
标头,并将其设置为XMLHttpRequest
以将其标记为AJAX。
几年前,这似乎已经被认为是标准的(可能是由于jQuery的巨大普及及其在几乎每个网站中的存在),许多服务器端框架甚至都有帮助程序来检查此标头中的内容。收到的您的请求:
HttpRequestBase.IsAjaxRequest()
HttpRequest.is_ajax()
flask.Request.is_xhr
但是,随着jQuery在前端世界的统治结束以及fetch
API的标准化以及其他未为此添加任何标头的现代客户端库的兴起,似乎默认情况下,该模式在后端也已过时;使用ASP.NET MVC时,newer versions中不包括该帮助器,并且Flask将其标记为已弃用。
答案 5 :(得分:0)
我总是检查“ text / html”是否是请求的“最佳”接受模仿类型,因为浏览器始终将其作为第一个发送。
Firefox示例:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
当然,这仍然可能是一个以text / html作为Accept mimetype的ajax请求,但是当您知道哪个客户端将使用您的后端api时,我发现这是可靠的。
答案 6 :(得分:-2)
你的用户代理,也就是浏览器,发送一个XHR标题,你可以从php中捕获这样的标题:
$_SERVER['HTTP_X_REQUESTED_WITH']