2013-08-28 172 views
14

我正在写一个JS脚本,它生活在一个系统中,该系统现在通过jQuery.ajaxPrefilter()中注册的函数中的jqXHR.setRequestHeader()向所有Ajax请求添加自定义XID标头。有什么办法可以删除由setRequestHeader()设置的Ajax头?

在我的脚本中,我需要向第三方站点发出Ajax请求,该站点的Access-Control-Allow-Headers未设置为允许此自定义XID标头。

看来我有3种选择:

  1. 找到一个方法来删除$就在于XID头()的beforeSend功能,我已经证实了ajaxPrefilter()函数之后被调用。
  2. 完全放弃使用$ .ajax(),而只是自己编写Ajax。
  3. $ .ajax()指向系统的后端,它接受定制的XID头,并通过cURL向第三方站点执行请求。

选择#1是首选,如果有一个简单的方法来做到这一点,因为它将是最干净和最快的路线。只是想不通如何

我试图重写它这样,但它没有工作:

beforeSend: function(jqXHR, settings) { 
    jqXHR.setRequestHeader('custom-xid-header', null); 
} 

任何想法?

+0

很确定这是不可能的(不幸的是)。我觉得这很容易克服,但需要通过jQuery进行更改。 'jqXHR'是一个真正的'XMLHttpRequest'的包装对象。所有jQuery需要做的就是跟踪任何额外的/自定义的头文件(比如在一个Object中),并且使用像removeHeader和setHeader这样的方法来修改这个Object。然后,当真正的请求被创建并发送时,该对象将被用于*实际*添加请求头部到真实请求。我想根据真实的工作流程/生命周期内部,它可能会也可能不会是可能的 – Ian

+0

大鼠,这就是我所害怕的。 –

+0

是的,它看起来像设置值为'空'或'“”只是设置一个空值...不删除整个标题。将功能请求提交给jQuery可能不是一个好主意。并以此为例。再次,它可能会也可能不会取决于内部生命周期 – Ian

回答

2
$.ajaxSetup({ 
    beforeSend: function(jqXHR, settings) { 
     jqXHR.setRequestHeader('custom-xid-header', null); 
    } 
}) 

看到http://api.jquery.com/jQuery.ajaxSetup/

+2

是不是OP是否尝试过并且没有工作? – Bergi

+2

正确的答案是http://stackoverflow.com/questions/2464192/how-to-remove-http-specific-headers-in-javascript –

+0

@AramKocharyan不,因为它不_remove_头 – randomsock

0

Overiding似乎的不工作,但有一个简单的解决。

$.ajaxSetup({ 
     beforeSend: function (jqXHR) { 
      if (sendToken == true) 
       jqXHR.setRequestHeader("Authorization", cookie); 
      return true; 
     } 
    }); 

检查sendToken变量。这是全球性的。 在我的应用程序开始时,我总是将它设置为true,因为我需要在任何地方设置标头。

但是,当我不想送“授权”头,我传递全球sendToken任何请求都可以去了。当所有的请求完成后,我只是简单地将它设置为true再次...

诀窍是jqXHR变量是本地的,不会每次都保留指定的值。 并且在ajaxSetup中设置的当前值不起作用,因为它总是添加新值而不是替换它。最重要的条件是我认为最简单有效的方法。

它为我工作。

0

这将删除使用$ .ajaxSetup()设置的标头。我想它会和beforeSend()一起工作。

delete $.ajaxSettings.headers["custom-xid-header"] 
3

我意识到这是一个旧的线程,但它仍然是一个问题!希望以下内容有助于为其他人解决问题,因为它对我们有帮助。

设置一个头null/undefined/""它被设置后也删除它,它发出的头还在,但与不用值或“不确定”或“空”。这可能从来不是你想要的,在我们的例子中,当它是授权标头时,完全拧紧SSO。

我们想出了解决方案依赖于@ marlar的建议(感谢)和jQuery的另一个不足的混合:你只能有一个beforeSend()挂钩,任何新的钩取代前一个。看起来,如果您在特定的$.ajax()请求中提供beforeSend(),它也会发生这种情况 - 它将覆盖$.ajaxSetup()中的任何默认值。通过这样做,可以防止默认挂钩设置标题。 (这不是100%理想的,因为在默认的beforeSend()中可能会做其他事情,但这种情况不会发生,但嘿)。

所以这科佩斯既为特定请求静态和动态组头:

if($.ajaxSettings && $.ajaxSettings.headers) { 
    delete $.ajaxSettings.headers.Authorization; 
} 
$.ajax({ 
    beforeSend: function() {}, // no op 
    // ... 
}); 

不能为prefilter()做同样的,但我认为beforeSend()是这样无论如何的更为常见方式。

相关问题