使用x-auth-token时访问受保护的静态文件

时间:2016-07-24 04:53:31

标签: angularjs spring spring-security http-headers spring-session

我使用spring会话生成的x-auth-token来保持通信,这对于ajax请求很好。但我有一个问题,我的文件不是被ajax取得。

这些文件是用户上传的内容,pdf,带有CSS和字体的html,基本上是浏览器可以呈现的内容,所以制作一个ajax强制下载按钮不是一个选项(尽管可能还有一种方法可以做这是为了让他们看到我没想到的。目前,浏览器GET通过<a href链接请求它们,因此不包含标题。

我正在使用AngularJS。解决此问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我知道这个问题已经有几个月了,但是当我第一次使用Spring Session时,我遇到了AngularJS的这个问题。它有点hacky,但它主要使用AngularJS的HTTP来检索文档并将其保存在浏览器的BLOB中。然后,创建一个隐藏的<a>标记,其中包含指向BLOB的链接,并以编程方式单击该链接。我有一个名为&#39; saveBlob&#39;的AngularJS服务。处理这个:

app.service('saveBlob', ['$http', function ($http) {
return {
    download: function(url, fileName) {
        $http.get(url, { responseType: 'arraybuffer' }).then(function(response) {
            var blob = new Blob(
                    [ response.data ], 
                    { type: response.headers('Content-Type') }
                );
            var objUrl = window.URL.createObjectURL(blob);
            var a = document.createElement("a");
            document.body.appendChild(a);
            a.style = "display: none";
            a.href = objUrl;
            if (fileName) {
                a.download = fileName;
            }
            else {
                var regex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/g;
                var match = regex.exec(response.headers('Content-Disposition'));
                var fn = match[1];
                a.download = fn.substring(1, fn.length - 1);
            }
            a.click();
            window.URL.revokeObjectURL(url);
        });
    }
}
}]);

&#39; saveBlob&#39;然后通过名为&#39; httpHref&#39;

的指令调用服务
app.directive('httpHref', ['$http', 'saveBlob', function ($http, saveBlob) {
return {
    link: function ($scope, elem, attrs) {
        function revokeObjectURL() {
            if ($scope.objectURL) {
                URL.revokeObjectURL($scope.objectURL);
            }
        }

        $scope.$watch('objectURL', function (objectURL) {
            elem.attr('href', objectURL);
        });

        $scope.$on('$destroy', function () {
            revokeObjectURL();
        });

        attrs.$observe('httpHref', function (url) {
            elem[0].onclick = function() {
                saveBlob.download(url);
            };
        });
    }
};
}]);

我从This GitHub Repository(根据MIT许可证获得许可)修改了此代码,所以感谢该项目的贡献者帮助我实现这一目标!