如何使用以下代码调用休息服务时发送标头信息

时间:2016-03-28 17:02:35

标签: angularjs angularjs-scope http-headers

我需要在下面的代码中发送授权标头,我用它来调用restful服务。一切正常,但标题信息没有发送。

services.factory('downloadService', ['$q', '$timeout', '$window',
    function ($q, $timeout, $window) {
        return {
            download: function (fileName) {

                var defer = $q.defer();

                $timeout(function () {
                    $window.location.href = 'lolo/download?fileName=' + fileName;

                }, 1000)
                .then(function () {
                    defer.resolve('success');
                }, function () {
                    defer.reject('error');
                });
                return defer.promise;
            }
        };
    }
]);

我需要发送以下授权标题 -

$http.defaults.headers.common.Authorization = $localStorage.authToken;

2 个答案:

答案 0 :(得分:0)

使用$window.location.href 无法传递标题,但您始终可以使用cookies进行授权。

虽然我建议在更改服务器实现上的任何内容之前查看security problems with cookies

答案 1 :(得分:0)

正如@ S4beR所说,你不能使用$ window.location.href传递头。 解决方法是将令牌作为查询字符串或使用cookie传递。但是,这些选项存在安全问题。 另一种方法是请求具有短寿命的临时下载令牌,例如60秒。然后将此下载令牌作为URL中的查询字符串传递。

services.factory('downloadService', ['$q', '$timeout', '$window', '$http', '$localStorage'
  function ($q, $timeout, $window, $http, $localStorage) {
    return {
        download: function (fileName) {

            var defer = $q.defer();
            var req = {
             method: 'POST',
             url: '/download/token',
             headers: {
                'Authorization': $localStorage.get('token')
             }
           }
            $http(req)
            .then( function (token) {
                $timeout(function () {
                   $window.open('lolo/download?fileName=' + fileName +"&token="+token, "_blank") = ;

                }, 1000)
            })
            .then(function () {
                defer.resolve('success');
            }, function () {
                defer.reject('error');
            });
            return defer.promise;
        }
    };
  }
]);