2010-08-11 2 views
1

Эта ситуация:Контроль доступа для бинарных файлов с Java

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

Это, как мы решим его:

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

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

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

Любые идеи?

ответ

2

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

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

E.g. не так:

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

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

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

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

+0

Мы просто исключили исключение IllegalStateException с тиком, который вы поделили. Итак, его один менее грязный секрет нам нужно скрыть от людей, платящих это ... = P – Chepech

0

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

+0

Это хорошие улучшения, но основные проблемы все еще остаются – Chepech

0

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

Смежные вопросы