Javascript 在发送前修改jQuery请求头

Javascript 在发送前修改jQuery请求头,javascript,jquery,ajax,Javascript,Jquery,Ajax,我有一个单页js应用程序,我正在向我的服务器发送包含日志的自定义标题,但我需要控制这些标题的大小,因为我的服务器不会接受大于8k的请求 到目前为止,我的解决方案是拦截来自我的应用程序的所有传出ajax请求 我正在使用,尤其是ajaxSend拦截所有请求。我无法在发送之前使用,,因为这是一个本地事件 我似乎无法访问回调中的请求头。我需要读取所有请求的标头,如果标头太大,则需要将其缩短。您希望在发送前使用修改请求。这些都包含在您链接到的文档中 全局ajaxSend事件不会帮助您篡改请求。最接近全局的

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

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

我正在使用,尤其是
ajaxSend
拦截所有请求。我无法在发送之前使用
,因为这是一个本地事件


我似乎无法访问回调中的请求头。我需要读取所有请求的标头,如果标头太大,则需要将其缩短。

您希望在发送前使用
修改请求。这些都包含在您链接到的文档中

全局
ajaxSend
事件不会帮助您篡改请求。最接近全局的是调用,在发送之前传递一个
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
对象,并再次调用
setRequestHeader
,根据需要截断字符串

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

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

您希望在发送请求之前使用
beforeSend
修改请求。这些都包含在您链接到的文档中

全局
ajaxSend
事件不会帮助您篡改请求。最接近全局的是调用,在发送之前传递一个
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
对象,并再次调用
setRequestHeader
,根据需要截断字符串

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

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

谢谢David,不过我想拦截所有请求,
beforeSend
是一个本地ajax事件,这就是我使用
ajaxSend
@alexandru.topliceanu的原因。啊,对不起。您可以使用
ajaxSetup
在发送前为所有请求设置特定的
侦听器默认值;查看我的更新答案。很好,但是我仍然需要访问标题来修改它们
beforeSend
jqXHR
settings
作为参数调用,它们似乎都不允许我检索请求头。i、 e.我可以使用
jqXHR.setRequestHeader()
设置标题,但如何读取所有标题。@alexandru.topliceanu:棘手的一个!我不知道从xhr无法轻松访问标题集合。请参阅我的第二次编辑,以获得建议的解决方法。它确实有效。但是,不能从jqXHR实例直接访问
readableHeaders
。因此,您必须使用返回原始XMLHttpRequest对象的
xhr
方法。谢谢David,但是我想拦截所有请求,
beforeSend
是本地ajax事件,这就是我使用
ajaxSend
@alexandru.topliceanu的原因。啊,对不起。您可以使用
ajaxSetup
在发送前为所有请求设置特定的
侦听器默认值;查看我的更新答案。很好,但是我仍然需要访问标题来修改它们
beforeSend
jqXHR
settings
作为参数调用,它们似乎都不允许我检索请求头。i、 e.我可以使用
jqXHR.setRequestHeader()
设置标题,但如何读取所有标题。@alexandru.topliceanu:棘手的一个!我不知道从xhr无法轻松访问标题集合。请参阅我的第二次编辑,以获得建议的解决方法。它确实有效。但是,不能从jqXHR实例直接访问
readableHeaders
。因此,必须使用返回原始XMLHttpRequest对象的
xhr
方法。检查此答案:检查此答案: