AngularJS - 动态设置默认的http标头

Jun*_*man 3 angularjs

为了克服CSRF攻击,我有作为描述的值从饼干采摘CSRF令牌送价值在标题为每个请求在这里.由于这是在每次请求时完成的,我在主模块的run函数中设置$ http的默认头.

现在,如果为同一网站打开了新选项卡,则服务器将发出新的csrf令牌(在cookie中).由于run函数只运行一次,因此csrf的默认标头将为旧标签(对于旧标签),而新的csrf cookie将发送到服务器,导致csrf-mismatch.

如何在全球范围内克服这个问题?

我想以某种方式创建一个函数,它将在每次调用$ http时运行,这样我就会覆盖默认的头文件.

注意:我不想为每个$ http请求设置此标头值.

(不是我认为它是相关的,但我使用的是ui-router)

编辑

这不仅限于csrf-token,我想根据登录用户设置一些其他标头,这必须动态完成(例如,当一个用户登录,然后注销,然后另一个用户登录).

har*_*shr 5

你需要使用http拦截器在每个请求上执行此操作.在这里阅读更多关于http拦截器的信息

下面是一个这样的例子

module.factory('xsrfTokenInterceptor', function ($q, $http) {
    return {
        'response': function (response) {
            var cookies = response.headers("Set-Cookie");
            var token = someCrazyParsing(cookies);
            $http.defaults.headers.common["X-CSRFToken"]=token;
            return response || $q.when(response);
        }  
    };
});
module.config(function($httpProvider){
    $httpProvider.interceptors.push('xsrfTokenInterceptor')
})
Run Code Online (Sandbox Code Playgroud)