2

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

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

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

我似乎无法访问回调中的请求标头。如果它太大,我需要阅读所有请求的标头并减少日志标头。

4

1 回答 1

4

您想beforeSend在发送请求之前使用它来修改请求。这一切都包含在您链接到的文档中。

全局ajaxSend事件不会帮助您篡改请求。您可以获得的最接近 global 的是 call 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对象中的特定日志记录头 in ,并在需要时再次beforeSend调用以截断字符串。setRequestHeader

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

$.ajaxSetup({
  beforeSend: function (jqXHR, settings) {
    console.log( settings.xhr().readableHeaders );
  }
});
于 2012-09-27T11:01:40.737 回答