10 Stimmen

Wie erstellt man "Aliase" in Apache Tomcat?

Ich arbeite an einer Webanwendung, mit der Benutzer Anhänge hochladen können. Diese Anhänge werden auf einem anderen Laufwerk als dem der Webanwendung gespeichert. Wie kann ich einen Alias (entsprechend den Aliasen des Apache HTTP-Servers) für dieses Laufwerk erstellen, damit die Benutzer diese Anhänge herunterladen können?

Derzeit erstelle ich eine Kontextdatei und lege sie in CATALINA_HOME/conf/Catalina/localhost ab, aber sie wird hin und wieder zufällig gelöscht. Die Kontextdatei heißt attachments.xml und der Inhalt ist unten dargestellt. Ich habe auch über virtuelle Hosts gelesen, aber wenn ich das richtig verstehe, ist ein virtueller Host nicht das, wonach ich suche. Ich verwende die Version 6.0.18 von Apache Tomcat.

attachments.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase    = "e:\uploads\attachments"
     reloadable = "true"
     crossContext   = "true">
</Context>

9voto

Dan Polites Punkte 6670

Ich habe viel Zeit mit der Recherche verbracht und eine Lösung gefunden, die das zufällige Löschen der Kontextdateien behebt. Ich fand diesen Auszug auf der Apache-Website unter dem Abschnitt zur Hostkonfiguration:

Sie können einen oder mehrere Context Elemente innerhalb dieses Host-Elements verschachteln, verschachteln, die jeweils eine andere Web Anwendung repräsentiert, die mit diesem virtuellen Host zugeordnet ist.

Die virtuellen Hosts werden in der Datei server.xml Die Datei befindet sich unter CATALINA_HOME \conf . Tomcat wird konfiguriert mit localhost als Standard-Host. Wenn wir also den Inhalt von anhänge.xml Aus dem ersten Beitrag ergibt sich folgendes:

<Host name="localhost"  appBase="webapps"
    unpackWARs="true" autoDeploy="true"
    xmlValidation="false" xmlNamespaceAware="false">

    <Context path="/attachments"
             docBase="e:\uploads\attachments"
             reloadable="true"
             crossContext="true" />
</Host>

Dies kommt der Definition von Aliasen ähnlich wie beim HTTP-Server des Apache am nächsten, denke ich.

7voto

Olaf Kock Punkte 44749

Es gibt mehrere Möglichkeiten.

  1. Verwendung von Apache als Frontend, Delegierung an Tomcat mittels mod_jk oder mod_proxy
  2. Ein Download-Servlet in Ihrer eigenen Anwendung bereitstellen, das die angeforderte Datei liefert
  3. 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.

2voto

Paulus Punkte 1243

Siehe den ersten Teil meiner neueren Frage für Möglichkeiten, dies durch Bearbeiten der Datei context.xml zu tun Wie füge ich Aliase zu einem Servlet-Kontext in Java hinzu? . Nach Ansicht mehrerer Personen ist es nun nicht mehr notwendig (2012: Tomcat 6 oder 7), Apache aus Leistungsgründen gegenüber Tomcat für die Bereitstellung statischer Inhalte zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X