在发送之前修改jQuery请求标头

时间:2012-09-27 10:59:05

标签: javascript jquery ajax

我有一个单页的js应用程序,我正在向包含日志的服务器发送自定义标头,但我需要控制这些标头的大小,因为我的服务器不接受大于8k的请求。

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

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

我似乎无法访问回调中的请求标头。我需要读取所有请求的标题,并在日志标题太大的情况下删除日志标题。

1 个答案:

答案 0 :(得分: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 );
  }
});