【问题标题】:Secured file serving安全的文件服务
【发布时间】:2016-02-12 20:33:12
【问题描述】:

我正在尝试为网站提供安全的文件服务功能。我考虑了几个适合我当前模型的选项:

  1. 使用 XMLHttpRequest 检索文件内容,然后根据文件类型和用户偏好提供显示或另存为功能。

我了解如何使用二进制 Ajax 功能(blob、arraybuffer)来检索二进制文件,并且我已经看到 this shim 用于实现 HTML5 另存为功能,但我担心这种技术的性能:大文件。我还没有测试过,但我不认为使用这种技术下载 1GB+ 文件的性能会很好。

  1. 在链接上设置 HTTP 标头(见下文),这样我就可以在标头中传递身份验证令牌,但仍然像正常下载一样将文件直接提供给浏览器,而不是通过 XMLHttpRequest 检索内容的麻烦.

我更喜欢这种方法,因为它非常适合当前的身份验证框架,并且只需要很少的额外代码,但据我所知,只有 Firefox 支持我想做的事情。

Firefox 能够在没有由 JavaScript 代码使用 httpChannel 显式发起的网络调用中设置 http 标头:Firefox HTTP channels。有谁知道其他浏览器是否支持此功能?我希望能够设置一个链接,例如:

window.location.href = 'blah';

并让代码观察设置自定义 HTTP 标头的网络流量:

httpChannel.setRequestHeader("X-Hello", "World", false);

虽然 Firefox 可以做到这一点非常酷,但我需要一个跨浏览器的解决方案。我看过这个问题:

Setting request header, in a URL

这基本上是我想要做的,但唯一推荐的解决方案是设置会话 cookie,我没有使用它。

【问题讨论】:

  • 这听起来像是一个 XY 问题。你的用例是什么?
  • 也许是的,让我重申一下这个问题。
  • 正常登录只允许认证用户下载有什么问题?
  • @PeeHaa 就是这样做的,但是当前的身份验证机制在每个请求的 http 请求标头中使用一个令牌,所以我要么需要使用现有的机制,它可以与其中一个一起使用我正在研究两个选项,或者使用其他功能扩展当前机制。

标签: javascript jquery


【解决方案1】:

好的,所以我使用选项 1. 从我的问题中构建了一个函数。仍然担心文件大小和性能,但这里有一个基本的解决方案:

viewFile : function( fileItem ) {

    var xhr = new XMLHttpRequest(), token, contentType, filename;

    xhr.onreadystatechange = function() {

        token = xhr.getResponseHeader( "X-Token" );

        if( token !== undefined && token !== null ){
            app.model.set( "token", token );
            sessionStorage.token = token;
        }

        if ( xhr.readyState === 4 ) {
            contentType = xhr.getResponseHeader( "Content-Type" );
            filename = xhr.getResponseHeader( "X-Filename" );
            response = xhr.response;
            var blob = new Blob([xhr.response], { type: contentType } );
            saveAs( blob, filename ); 
        }
    };

    xhr.open( 'GET', "/index.cfm/api/filelocker/" + fileItem.fileid, true );
    xhr.responseType = "arraybuffer";
    xhr.setRequestHeader ( "X-Token", app.model.get( "token" ) );

    xhr.send();     
}

此技术使用现有的身份验证机制。我会看看它在处理大文件时的效果如何。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多