25

Angular.js 在使用 $http 对象访问 Web 服务时,会自动将 X-Requested-With:XMLHttpRequest 标头添加到请求中。

我使用 CORS 访问的 Web 服务不支持 X-Requested-With 标头,因此我试图消除它,但我无法访问 $httpProvider 对象。我得到一个未定义的对象错误,如果我在控制器参数中引用它,以便角度注入它,我得到一个“错误:未知提供者:$httpProviderProvider <- $httpProvider”

所以我想知道如何访问 $httpProvider,就像它在文档 (http://docs.angularjs.org/api/ng.$http) 中所说的那样告诉 angular.js 不要发送该标头...

4

4 回答 4

26
angular.module('myModule', [])
    .config(['$httpProvider', function($httpProvider) {
        delete $httpProvider.defaults.headers.common["X-Requested-With"]
    }])
于 2012-09-07T06:29:14.703 回答
11

我发现,除了 Justen 的回答之外,我还可以像这样根据每个请求进行操作:

delete $http.defaults.headers.common['X-Requested-With']
于 2012-09-07T06:49:32.737 回答
6

由于 Angular JS 版本 1.1.1 不再需要删除标题。

查看更改日志:
https ://github.com/angular/angular.js/blob/master/CHANGELOG.md#111-pathological-kerning-2012-11-26

对于像我这样使用标头来识别 ajax 请求并以不同方式响应它们的人。

例如,在会话到期后发出请求。

您可以像这样重新启用标头:

angular.module('yourModule', [])
.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
}]);
于 2014-05-20T19:49:33.037 回答
0

由于 Angular JS 版本 1.1.1 不再需要删除标题。在https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet#Protecting_REST_Services:_Use_of_Custom_Request_Headers上提到了此更改

如 Josue 所示,这可以很容易地再次添加到所有请求中,如下所示:

angular.module('yourModule', [])
    .config(['$httpProvider', function($httpProvider) {
        $httpProvider.defaults.headers.common["X-Requested-With"] = 'XMLHttpRequest';
    }]);

将标头的配置设置为未定义以删除特定外部请求的标头。

let urlExternalValidator = 'https://openiban.com/validate/' + this.iban + '?getBIC=true&validateBankCode=true';
this.$http.get(urlExternalValidator, {
    // simple request to not trigger a CORS preflight
    // https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
    headers: {
        'X-Requested-With': undefined
    }
})

此外,您可以在调用 $http(config) 时在传递的配置对象中提供 headers 属性,它会覆盖默认值而不全局更改它们。

要根据每个请求显式删除通过 $httpProvider.defaults.headers 自动添加的标头,请使用 headers 属性,将所需的标头设置为未定义

https://docs.angularjs.org/api/ng/service/ $http#setting-http-headers

于 2018-01-24T13:49:02.267 回答