关于javascript:AJAX请求和常规浏览器请求之间的区别

Difference between AJAX request and a regular browser request

Ajax请求和直接浏览器请求之间有区别吗(就如何调用和加载网页而言)?

换句话说,我的意思是:直接服务器端请求的处理方式与客户端请求(由浏览器启动)有什么不同吗?


可能存在一些头差异,但主要的行为差异在客户机上。

当浏览器像window.location.href="index.html"中那样发出常规请求时,它将清除当前窗口并将服务器响应加载到窗口中。

对于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)在其请求中包含X-Requested-With头,并将其设置为XMLHttpRequest以将其标记为Ajax。

几年前,这似乎被认为是标准的(可能是由于jquery的巨大普及以及它在几乎每个网站上的存在),许多服务器端框架甚至有帮助者负责在收到的请求中检查这个头:

ASP.NET MVC 5:

1
HttpRequestBase.IsAjaxRequest()

Django:

1
HttpRequest.is_ajax()

瓶:

1
flask.Request.is_xhr

然而,似乎随着jquery在前端世界的统治结束,fetchAPI的标准化,以及其他现代客户端库的兴起,这些库在默认情况下没有为此目的添加任何报头,这种模式在后端也已经过时;在ASP.NET MVC中,新版本中不包括助手。离子和烧瓶标记为已弃用。


虽然我相信你们,但在网络逻辑上有一种完全奇怪的想法:我正在使用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客户机发送一个X-Requested-With=XMLHttpRequestHTTP头


您的用户代理,也就是浏览器,发送一个xhr头文件,您可以从下面的php中获取:

1
$_SERVER['HTTP_X_REQUESTED_WITH']