2009-12-28 8 views
28

Mein neuestes Projekt kann Dokumente mit Informationen aus einer Datenbank generieren.Bewährte Methode zum Speichern temporärer Daten für eine Webanwendung

Also kopiere ich die Dokumentvorlage bei Bedarf in einen temporären Ordner für einen Benutzer und modifiziere ihn. Ich mache das, weil jede Vorlage während der Änderung verfügbar sein muss.

Anschließend erhält der Benutzer sein Dokument über einen Download-Link von meiner Webapp.

Meine Frage: Gibt es eine Best Practice zum Speichern von Webapp-Daten? Ich dachte, Temp wäre nett dafür. Aber da ich die Daten selbst löschen muss, habe ich daran gedacht, sie neben meinem WAR-Ordner in den Tomcat-Webapp-Ordner zu stellen.

Ich verwende Windows 2003 als Host-System mit Tomcat. Ich verwende Grails, Java und Maven für mein Projekt ... weiß nicht, ob diese Informationen benötigt werden.

Edit:
Hauptgrund, warum ich diese triviale Frage ist ... wenn ich schafft kümmern/meine temporären Daten löschen ... es ist immer noch eine gute Praxis, Temp-Ordner auf dem System zu benutzen? ich nicht sicher bin, ...

Antwort

33

Wenn (empfindliche) benutzerspezifischen Dateien in Webapp zu speichern, stellen Sie sicher, dass Sie es in /WEB-INF irgendwo speichern und Zugriff auf sich mit einem Servlet, die (indirekt) dem angemeldeten Benutzer überprüft, Ansonsten ist es für jeden Benutzer/Hacker im World Wide Web zugänglich. Der Vorteil ist, dass es programmatisch leicht zugänglich ist unter ServletContext#getResource() oder #getRealPath(). Der Nachteil ist, dass sie verloren gehen, wenn Sie die Webanwendung erneut bereitstellen.

Sie können sie auch im standardmäßigen temporären Ordner speichern. Der Vorteil ist, dass es durch Standard-APIs wie File#createTempFile() oder System.getProperty("java.io.tmpdir") zugänglich ist. Der temporäre Ordner hat den Nachteil, dass die vom Betriebssystem gesteuerte Ordnerbereinigung nicht von Java aus gesteuert werden kann. Sie riskieren also, dass die Daten verloren gehen, wenn Sie die Ressource schließen, sie aber später noch benötigen.

Sie können sie auch in einem festen Ordner außerhalb der Webapp speichern. Es hat den Vorteil, dass das Zeug nicht verloren geht, wenn Sie die Webanwendung erneut bereitstellen. Der Nachteil ist, dass Sie den Ordner selbst mit ausreichenden Betriebssystemrechten erstellen müssen, die bei Hosts von Drittanbietern möglicherweise nicht anwendbar sind.

Die Reinigung Ihrer eigenen temporären Ressourcen gehört sicherlich zu den Aufgaben, die Sie selbst erledigen müssen. Ich würde es nicht als eine Sorge betrachten.

Überwiegen Sie einfach die Vorteile/Nachteile.

+0

war mir nicht bewusst, dass das Betriebssystem den temporären Ordner entscheiden können, bereinigen. Können Sie das näher ausführen? –

+1

Die meisten Serversysteme führen einmal pro Tag/Woche/Monat einen Cron-Job aus, der alle Dateien löscht, die älter als N Tage von/tmp sind. Dies stellt sicher, dass der Speicherplatz nicht erschöpft ist, weil jemand vergessen hat, sich selbst zu bereinigen. –

+1

@EliAcherkan: 'tmp' sollte trotzdem klingeln –

5

Ich glaube, dass temporäre Dateien in einem temporären Ordner gehören. In Ihrem Fall löschen Sie die Dateien selbst, aber was passiert, wenn beim Löschen der Datei ein Fehler auftritt? Oder was, wenn ein Server heruntergefahren wird, bevor die Dateien gelöscht werden? Wenn Sie in einen temporären Ordner schreiben, besteht zumindest die Hoffnung, dass die Dateien später (manuell oder durch einen Prozess) bereinigt werden.

Selbst wenn eine Anwendung persistente Daten speichern möchte (dh nicht temporär), sollte sie dennoch nicht im Tomcat-Verzeichnis gespeichert werden, da diese Verzeichnisse bei jeder neuen Version gelöscht oder überschrieben werden Anwendung (oder installieren Sie sogar eine neue Version von Tomcat).

Nützliche Methoden:

12
  • Das Speichern von Informationen im Web-Anwendungsordner nicht immer arbeiten. Einige Anwendungsserver erweitern die bereitgestellte WAR-Datei nicht und daher gibt es kein "Arbeitsverzeichnis" für eine Webanwendung. Einige Systemadministratoren verhindern auch den Zugriff von Webanwendungen auf das Dateisystem (dies hängt von den Sicherheitsmanagerrichtlinien ab).
  • Temporäre Dateien sollten verwendet werden für, nun, temporäre Daten. Daten, die bei Bedarf rekonstruiert werden können. Verwenden Sie keine temporären Dateien, die von Benutzern heruntergeladen werden sollten. Z.B. Wenn Ihr System denkt, dass temporäre Dateien bereinigt werden sollen oder wenn Sie den Anwendungsserver neu starten, möchte der Benutzer diese Dateien trotzdem herunterladen, obwohl sie in der Zwischenzeit möglicherweise gelöscht werden.
  • Der richtige Ort, um solche Daten zu speichern, ist die Datenbank. Ihre Dokumente sind nicht wirklich temporär in den Mitteln der temporären Dateien. Verwenden Sie eine Datenbank, um die Dokumente zu speichern und die Datenbank als Cache für Dokumente zu verwenden. Sie können dann Ihre eigene Bereinigungsstrategie implementieren. Es dient auch als persistenter Speicher, so dass Sie sich keine Gedanken über Server-Neustarts machen müssen. Darüber hinaus können Sie zusätzliche Metadaten wie die letzte Zugriffszeit oder einen Zugriffszähler hinzufügen und dem Benutzer auf einfache Weise eine Liste der von ihm erstellten Dokumente bereitstellen. Wenn Ihre Dokumentverarbeitungsbibliothek für die Bearbeitung eine java.io.File erfordert, speichern Sie das Dokument aus der Datenbank nur in einer temporären Datei, starten Sie die Verarbeitung, und lesen Sie es in die Datenbank zurück.
6

Eineine Web-Container stellen ein Kontextattribut, das in einem temporären Verzeichnis-Punkte:

Servlet-Spezifikation SRV.3.7.1 Temporäre Arbeitsverzeichnisse

Ein temporäres Speicherverzeichnis für jeden Servlet-Kontext erforderlich ist. Servlet Container müssen ein privates temporäres Verzeichnis pro Servletkontext bereitstellen und über das Kontextattribut ServletContext.TEMPDIR (javax.servlet.context.tempdir) verfügbar machen. Die dem Attribut zugeordneten Objekte müssen vom Typ java.io.File sein.

Beispiel:

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

Nur um das hinzuzufügen: Mit 'Datei tmpDir = (Datei) getServletContext(). GetAttribute (ServletContext.TEMPDIR);' erhalten Sie das temporäre Dateiverzeichnis für die aktuelle Webanwendung, die vom Servlet-Container bereitgestellt wird. – megaflop

+0

Dieser Code scheint nicht gültig zu sein ... – Jeef

+0

@Jeef Warum denkst du? – dajood

Verwandte Themen