2013-06-12 90 views
1

我是新来的jQuery,并希望使用普通HTTP 1.0连接关闭来发出POST请求,而不是当前保持活动状态的HTTP 1.1连接。如何强制JQuery发出HTTP 1.0请求并关闭连接

下面是执行该帖子的按钮的onClick处理程序。

$("#certGenBtn").click(function(event) { 
$.ajax({ 
    type: "POST", 
    url: "http://localhost:9099/", 
    data: { testVal : "data" }, 
    success: function(data) { 
       alert("whoops"); 
      }, 
    beforeSend: function(xhr) { 
        xhr.setRequestHeader("Connection", "close"); 
       } 
    }); 
}); 

原始输出倾倒在服务器端如下:

POST/HTTP/1.1 
Host: localhost:9099 
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0 
Accept: */* 
Accept-Language: en-ZA,en-GB;q=0.8,en-US;q=0.5,en;q=0.3 
Accept-Encoding: gzip, deflate 
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 
Referer: http://localhost/ 
Content-Length: 12 
Origin: http://localhost 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 

testVal=data 

连接关闭头被“忽略”和连接保持开放的服务器,以便最后一行testVal=data只通过一次我重新加载页面(我认为这是因为连接然后由浏览器关闭)。我认为这是非常简单和/或愚蠢的,我失踪,但在文档中看不到任何东西。

回答

1

1)根据HTTP 1.1规范,Connection: close是一个有效的标题:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

如何试图用头键代替beforeSend增加吗?

.ajax({ 

    .... 
    headers: {Connection: close}, 

}); 

2)jQuery的文档的beforeSend功能指定以下函数签名:

beforeSend 
Type: Function(jqXHR jqXHR, PlainObject settings) 

所以您也可以尝试添加标题到设置对象而不是jqXHR对象。

好吧,我测试了你的原始代码以及我的建议,但都没有成功。它看起来像的XMLHttpRequest规范禁止设置连接头:

的setRequestHeader(标题,值)方法必须执行这些步骤:

终止这些步骤,如果报头是用于 一个不区分大小写匹配以下标题:

... 连接 ...

上述标题由用户代理控制,以让它控制 寿运输方面。这保证了数据完整性达到某种程度。
http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader-method

+1

非常感谢你!我 对我身边相同的结果,有没有办法迫使HTTP 1.0而不是HTTP 1.1吗? AFAIK'连接:keep-alive'是一个HTTP 1.1特有的,它不在HTTP 1.0中。 – twocents

+0

“用户代理”是指您的浏览器。我认为你必须找出一种方法来配置你的浏览器使用HTTP 1.0--但是,除非js只是个人使用,否则有什么意义。我环顾了Firefox 21.0,并且没有看到设置。 – 7stud

+0

我不是指用户代理部分,服务器接收到的响应的第一行是'POST/HTTP/1.1',表示浏览器使用HTTP 1.1协议而不是HTTP 1.0发出请求。如果我只能强制客户端使用HTTP 1.0而不是HTTP 1。1,那么保持活跃的整个概念就会消失(Connection头部不在HTTP 1.0规范中)[link](http://www.w3.org/Protocols/HTTP/1.0/draft-ietf-http-spec。 html) – twocents

1
var xhr = $.ajax({ 
    type: "POST", 
    url: "some.php", 
    data: "name=John&location=Boston", 
    success: function(msg){ 
     alert("Data Saved: " + msg); 
    } 
}); 

//kill the request 
xhr.abort()