我正在开发一个带有Spring Boot
的RESTful API,并使用oAuth2.0
(通过Spring Security
)和我在AngularJS中的前端进行保护。
我需要下载一个文件,我读到的每篇帖子都说(我理解)我应该使用window.open('urlToTheFileEndpoint');
但是这样做,我无法添加安全标头(就像我所有其他 ajax 请求一样),因此 API 不允许完成我的请求。
有没有办法解决这个问题?还是应该使此文件终结点不安全?
这个 SO 线程可能很有用:
下载带有需要标头并提供内容的 REST 请求的文件
它还提到了这篇文章:
使用 HTTP 请求标头下载文件
下面是一个片段:
var id = 123;
var req = ic.ajax.raw({
type: 'GET',
url: '/api/dowloads/'+id,
beforeSend: function (request) {
request.setRequestHeader('token', 'token for '+id);
},
processData: false
});
这就是我将如何解决问题:
当用户单击"下载"时,我将对 API 服务器进行 ajax 调用,该服务器不返回文件,但返回临时uuid
。服务器将创建一个名为 uuid.route
的临时文件(即:abc-123.route),其中包含该文件的真实路由(即:/mnt/data/files/excel_template.xlsx)。
然后当 ajax 调用返回 uuid 时,我可以调用 window.open('getFile?uuid=abc-123')
.这将是一个不安全的终结点。但是,一旦下载或在过期时间内,此路由文件将被删除,因此永远无法再次调用。
这样,它支持任何文件,任何大小。
这是我最好的方法。