Контроль доступа к двоичным файлам с Java - PullRequest
1 голос
/ 12 августа 2010

Это ситуация:

У нас есть несколько двоичных файлов (PDF, PPT, ZIPz и т. Д.), Которые хранятся на сервере, отличном от того, где находится наше приложение. Нам нужно сделать их доступными для пользователей нашего приложения. Но файлы имеют чрезвычайно конфиденциальную информацию, которая не может быть прочитана кем-либо еще, кроме пользователя, который имеет к ним доступ, а это значит, что нам нужно проверить пользователя, который пытается получить доступ к файлу, прежде чем он / она сможет его загрузить.

Вот как мы это решаем:

  1. Мы получаем файл с удаленного сервера, сохраняем его в не публичном месте.
  2. Мы читаем файл в байтовый массив, затем удаляем файл.
  3. Мы записываем файл через JSP, используя outputStream ответа. (Мы не можем очистить его через сервлет, потому что мы используем проприетарный MVC, который мы не можем изменить, поэтому все выходные данные являются JSP, поэтому мы получаем исключение java.lang.IllegalStateException, но оно работает).

Я обеспокоен тремя аспектами этого решения; Размер файла сильно влияет на размер кучи, размер файла ограничен макс. Байтом [Integer.MAXSIZE], и, наконец, мы получаем исключение java.lang.IllegalStateException каждый раз, когда кто-то загружает файл, потому что мы вызываем response.getOutputStream ( ), поэтому наш журнал сильно растет (мы не можем его очистить через сервлет, потому что мы используем проприетарный MVC, который мы не можем изменять или расширять)

Я почти уверен, что есть более элегантный способ сделать это.

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 12 августа 2010

На самом деле просто не храните его локально. Вы получаете это как InputStream откуда-то еще, верно? Просто напишите немедленно в OutputStream ответа. Тогда нет необходимости связываться с ним ни в памяти Java, ни в файловой системе локального диска. Это означает, что вы должны поместить логику для получения файла в файл JSP. Плохо, плохо, но так как это, по-видимому, проприетарная структура ...

Затем часть IllegalStateException, вам просто нужно убедиться, что нет пробелов вне скриптлетов , включая новых строк . Все это будет неявно записано через response.getWriter(), но это невозможно, потому что вы уже вызвали response.getOutputStream() для файла. Удалите все, что находится за пределами <% %> в JSP. При необходимости склейте несколько скриптлетов. Не забудьте удалить последний символ новой строки внизу файла.

например. не так:

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

Но более того:

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

Удачи в этом веб-приложении.

0 голосов
/ 12 августа 2010

Вероятно, наиболее элегантным решением будет использование существующего программного продукта с открытым исходным кодом. Я верю, что Дерево Знаний удовлетворит ваши требования.

0 голосов
/ 12 августа 2010

Пропустите шаг 2 и прочитайте файл непосредственно в выходной поток ответа.
Дайте каждому файлу UUID для имени, чтобы у вас не было конфликтов с именами файлов.Сделайте так, чтобы демон работал и очищал любые файлы старше 15 минут.

...