Подтвердить что ты не робот

Лучшая практика хранения временных данных для webapp

Мой новый проект способен генерировать документы с информацией из базы данных.

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

После этого пользователь получает свой документ через ссылку для загрузки из моего веб-сайта.

Мой вопрос: есть ли наилучшая практика для хранения данных webapp? Я думал, что темп будет приятным. Но поскольку я должен сам удалить данные, я подумал о том, чтобы разместить его, кроме моей папки WAR, в папке webapp tomcat.

Я использую Windows 2003 как хост-систему с Tomcat. Я использую Grails, Java и Maven для моего проекта... не знаю, нужна ли эта информация.

Edit:
Основная причина, по которой я задаю этот тривиальный вопрос, - это... если я позабочусь о создании/удалении временных данных... неужели по-прежнему рекомендуется использовать временную папку в системе? Я не уверен в этом...

4b9b3361

Ответ 1

При хранении (чувствительных) пользовательских файлов в webapp убедитесь, что вы храните его где-то в /WEB-INF и обращаетесь к ним с помощью Servlet, который (косвенно) проверяет зарегистрированного пользователя, в противном случае он доступен для любого пользователя/хакер во всемирной паутине. Преимуществом является то, что он легко доступен программным путем ServletContext#getResource() или #getRealPath(). Недостатком является то, что они будут потеряны всякий раз, когда вы повторно развертываете webapp.

Вы также можете сохранить их в временной папке по умолчанию. Преимущество состоит в том, что он доступен стандартным API, например File#createTempFile() или System.getProperty("java.io.tmpdir"). Временная папка имеет тот недостаток, что очистка папок, управляемых ОС, не контролируется с помощью Java, поэтому вы можете рисковать тем, что материал теряется всякий раз, когда вы закрываете ресурс, но все же нуждаетесь в нем позже.

Вы также можете сохранить их в фиксированной папке за пределами webapp. Это имеет то преимущество, что материал не теряется всякий раз, когда вы повторно развертываете webapp. Недостатком является то, что вам необходимо создать папку самостоятельно с достаточными правами ОС, которые могут быть неприменимы на сторонних хостах.

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

Просто перевесить преимущества/недостатки.

Ответ 2

  • Сохранение информации в папке веб-приложения не всегда работает. Некоторые серверы приложений не расширяют развернутый WAR файл и, следовательно, нет "рабочего каталога" для веб-приложения. Некоторые администраторы системы также предотвращают доступ к файловой системе веб-приложений (это зависит от политик диспетчера безопасности).
  • Временные файлы должны использоваться для временных данных. Данные, которые могут быть восстановлены по требованию. Не используйте временные файлы, которые должны быть загружены пользователями. Например. когда ваша система думает, что она должна очищать временные файлы или перезагружать сервер приложений, пользователь все равно хочет загрузить эти файлы, хотя они могут быть удалены в среднем.
  • Правильное место для хранения таких данных - это база данных. Ваши документы не являются временными в отношении временных файлов. Используйте базу данных для хранения документов и использования базы данных в качестве кеша для документов. Затем вы можете реализовать свою собственную стратегию очистки. Он также служит постоянным хранилищем, поэтому вам не нужно беспокоиться о перезагрузке сервера. Кроме того, у вас могут быть дополнительные метаданные, такие как время последнего доступа или счетчик доступа, и легко предоставить пользователю список документов, которые он создал. Если для обработки документов требуется java.io.File для манипуляции, только затем сохраните документ из базы данных в файл temp, запустите обработку и прочитайте ее обратно в базу данных.

Ответ 3

Веб-контейнер предоставляет атрибут контекста, указывающий на каталог temp:

Спецификация сервлета SRV.3.7.1 Временные рабочие каталоги

Для каждого контекста сервлета требуется каталог временного хранения. Servlet контейнеры должны предоставлять приватную временную директорию в контексте сервлета и создавать он доступен через атрибут ServletContext.TEMPDIR (javax.servlet.context.tempdir). Объекты связанный с атрибутом должен быть типа java.io.File.

Пример:

File appTempDir = getServletContext().getAttribute(ServletContext.TEMPDIR);
File tempFile = File.createTempFile("process1", ".txt", appTempDir);
tempFile.deleteOnExit();
try {
    ...
} finally {
    tempFile.delete();
}

Ответ 4

Я считаю, что временные файлы принадлежат во временной папке. В вашем случае вы сами удаляете файлы, но что, если есть ошибка в операции удаления файлов? Или что, если есть остановка сервера перед удалением файлов? Если вы пишете во временную папку, есть хоть какая-то надежда, что файлы будут очищены позже (вручную или каким-то процессом).

Даже когда приложение хочет хранить постоянные данные (т.е. не временные), я думаю, что он все равно не должен храниться в каталоге Tomcat, потому что эти каталоги, как правило, удаляются или перезаписываются всякий раз, когда вы развертываете новую версию своего приложения (или даже установить новую версию Tomcat).

Полезные методы: