Es gibt mehrere Möglichkeiten.
- Verwendung von Apache als Frontend, Delegierung an Tomcat mittels mod_jk oder mod_proxy
- Ein Download-Servlet in Ihrer eigenen Anwendung bereitstellen, das die angeforderte Datei liefert
- Erstellen Sie das Verzeichnis, das Tomcat als Webanwendung bereitstellen soll
jede hat einige Nachteile und einige Vorteile. Ich bevorzuge aus mehreren Gründen die erste Lösung:
- Meine Hauptgründe gelten für unixoide Systeme, von denen Sie offensichtlich nicht sprechen: Nur Root kann Ports kleiner als 1024 binden, z.B. 80. Daher müsste Tomcat als Root laufen (ich weiß, dass es Mechanismen gibt, die es Benutzern erlauben, sich an niedrige Ports zu binden, aber ich bin nie dazu gekommen, sie zu benutzen). Apache wird normalerweise als Root gestartet, verliert aber diese Rechte, sobald Port 80 gebunden ist.
- Apache soll bei der Bereitstellung statischer Ressourcen viel besser sein als Tomcat (ich habe es nie gemessen, aber es fällt mir schwer, das Gegenteil zu glauben)
- Offensichtlich wissen Sie, wie man Aliase in Apache erstellt - es wäre trivial, dies zu tun.
Über das Download-Servlet:
Auf diese Weise hätten Sie ein Servlet, das Ihre statischen Ressourcen bereitstellt, die Sie an die URLs "/download/*" binden könnten (z. B. in der Anwendung, die auch Datei-Uploads abwickelt) Sie hätten einen Vorteil:
- Sie müssen das Verzeichnis, in dem Ihre Dateien gespeichert sind, nur einmal konfigurieren
- Bei Bedarf können Sie problemlos Berechtigungsprüfungen einrichten (z. B. Anmeldung für das Herunterladen erforderlich).
- Sie müssen nur eine vollständig in sich geschlossene Anwendung bereitstellen.
- Das Download-Servlet ist trivial - finden Sie die Datei, setzen Sie ihren Namen und Dateityp in den Ausgabestrom und streamen Sie sie byteweise, dann schließen Sie den Ausgabestrom (stellen Sie sicher, dass Sie mit angreifenden Dateinamen wie "/download/../../../etc/passwd" oder "/download/C:/Windows/someimportantfile.xxx" umgehen können), z.B. durch Verwendung des java.io.File-Konstruktors, der das Basisverzeichnis als separaten Parameter erhält.
Die dritte Option hat einige schwerwiegende Nachteile und macht Sie angreifbar, wenn Sie sich nicht besonders um sie kümmern:
- Tomcat bedient keine Verzeichnisse, sondern Webapps. Daher benötigt "E:/upload/attachments" mindestens ein Verzeichnis namens "WEB-INF", das "web.xml" enthält. Achten Sie darauf, dass die hochladende Webanwendung keinen Schreibzugriff auf dieses Verzeichnis und diese Datei hat. Mit dieser Bestimmung könnten Sie Tomcat das Verzeichnis bereitstellen lassen.
- Allerdings: Konfigurieren Sie die enthaltene web.xml so, dass "*.jsp" nicht als jsp ausgeliefert wird, sonst würde Tomcat jsp-Dateien nicht nur ausliefern, sondern auch ausführen. Stellen Sie sich vor, jemand lädt "index.jsp" hoch mit
<% System.exit(0); %>
oder mehr bösartige Inhalte.
Ein zusätzlicher Gedanke: Sie brauchen nicht die zusätzlichen crosscontext="true"
. Dies würde bedeuten, dass die Webanwendung, die Sie nur zum Bereitstellen Ihrer Dateien einsetzen, Zugriff auf andere Webanwendungen hat, z. B. in der Lage ist, sie zu verwalten oder auf ihre privaten Daten zuzugreifen. Normalerweise brauchen Sie das überhaupt nicht, im Fall Ihrer Frage wollen Sie das definitiv nicht.