使用Java对二进制文件进行访问控制

时间:2010-08-11 22:37:06

标签: java jsp servlets bytearray

情况就是这样:

我们有一些存储在与我们的应用程序不同的服务器中的二进制文件(PDF,PPT,ZIPz等)。我们需要在我们的应用中为用户提供这些内容。但是文件具有极其敏感的信息,除了可以访问它们的用户之外,其他任何人都无法读取这些信息,这意味着我们需要在下载文件之前验证试图访问该文件的用户。

这就是我们解决问题的方法:

  1. 我们从远程服务器获取文件,将其存储在非公开位置。
  2. 我们将文件读入一个字节数组,然后删除该文件。
  3. 我们使用响应的outputStream通过JSP编写文件。 (我们不能通过servlet刷新它,因为我们使用的是一个我们无法修改的专有MVC,因此所有输出都是JSP,所以我们得到一个java.lang.IllegalStateException但它可以工作)。
  4. 我关心这个解决方案的3个方面;文件大小会显着影响堆大小,文件大小限制为最大字节[Integer.MAXSIZE],最后每次有人下载文件时都会得到java.lang.IllegalStateException,因为我们正在调用response.getOutputStream( ),所以我们的日志正在增长很多。(我们无法通过servlet刷新它,因为我们使用的是我们无法修改或扩展的专有MVC)

    我很确定有更优雅的方法来做到这一点。

    有什么想法吗?

3 个答案:

答案 0 :(得分:2)

确实只是不要在本地存储它。你从其他地方得到它InputStream,对吧?只需将立即写入响应的OutputStream即可。然后就不需要在Java的内存和本地磁盘文件系统中获取它。这意味着您应该将用于获取文件的逻辑放在JSP文件中。糟糕,糟糕,但因为这显然是一个专有框架......

然后是IllegalStateException部分,您只需要确保 scriptlet 之外没有空白,包括换行符。它将全部隐含地通过response.getWriter()编写,但这是不可能的,因为您已经为该文件调用了response.getOutputStream()。删除JSP中<% %>之外的所有内容。必要时将多个scriptlet粘贴在一起。不要忘记删除文件底部的最后一个换行符。

E.g。不是这样:

<%@ page import="java.io.*" %>
<% ... %>
<% ... %>
<% ... %>
 

但更重要的是:

<%@ page import="java.io.*" %><%
   ...
   ...
   ... %>

祝你好运这个webapp。

答案 1 :(得分:0)

跳过步骤2并直接将文件读入响应的输出流 为每个文件指定名称的UUID,因此您不会与文件名冲突。有一个守护进程去清理任何超过15分钟的文件。

答案 2 :(得分:0)

最优雅的解决方案可能是使用现有的开源软件产品。我相信知识树会满足您的要求。