2012-09-27 60 views
0

我有一个单独的页面js应用程序,并且向自己的包含日志的服务器发送自定义标头,但是我需要控制这些标头的大小,因为我的服务器不会接受大于8k的请求。在发送之前修改jQuery请求头文件

到目前为止,我的解决方案是拦截来自我的应用程序的所有传出的ajax请求。

我正在使用jQuery Global Ajax Events,特别是ajaxSend来拦截所有请求。我无法使用beforeSend,因为这是本地事件。

我似乎无法访问回调中的请求标头。我需要读取所有请求的标题,并且如果日志标题太大,请将其剪下。

+0

退房这样的回答:http://stackoverflow.com/questions/7686827/how-can-i-add-a-custom-http-header-to-ajax-request-with-js-or -jquery –

回答

3

您希望使用beforeSend在请求发送前修改请求。这些都包含在您链接的文档中。全球ajaxSend事件不会帮助您篡改请求。距离全球最近的东西是电话ajaxSetup,通过beforeSend选项是所有后续ajax调用的默认选项。


似乎没有简单的方法从XMLHttpRequest对象获取请求标头。由于我假设你自己设置你的日志标题,然而,你也许可以挂接到这些标题的设置,并存储访问参考他们:

XMLHttpRequest.prototype.readableHeaders = {}; 
XMLHttpRequest.prototype.proxiedSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader; 
XMLHttpRequest.prototype.setRequestHeader = function(header, value) { 
    this.proxiedSetRequestHeader(header, value); 
    this.readableHeaders[header] = value; 
}; 

通过这种方式,你应该能够直接检查jqXHR.readableHeaders对象的特定日志记录标题,并在beforeSend中再次调用setRequestHeader,以便截断字符串(如果需要)。

要检索标头,您需要从jqXHR对象访问XMLHttpRequest的基础实例。使用xhr()函数来检索实例。

$.ajaxSetup({ 
    beforeSend: function (jqXHR, settings) { 
    console.log(settings.xhr().readableHeaders); 
    } 
}); 
+0

感谢大卫,但是我想拦截**所有请求**,'beforeSend'是一个本地ajax事件,这就是为什么我使用'ajaxSend' –

+0

@ alexandru.topliceanu:啊,对不起。您可以使用'ajaxSetup'为所有请求设置一个特定的'beforeSend'侦听器默认值;看到我更新的答案。 –

+0

太棒了,但我仍然需要访问标题才能修改它们。 'beforeSend'被'jqXHR'和'settings'作为params调用,它们都不允许我检索请求标头。即我可以使用'jqXHR.setRequestHeader()'来设置标题,但是我如何读取所有标题。 –

相关问题