2008-12-08 18 views
10

Pracuję nad aplikacją internetową, która umożliwia użytkownikom przesyłanie załączników. Te załączniki są przechowywane na innym dysku niż aplikacja internetowa. Jak mogę utworzyć alias (odpowiadający aliasom serwera HTTP Apache) na tym dysku, aby użytkownicy mogli pobrać te załączniki?Jak utworzyć "Aliasy" w Apache Tomcat?

Obecnie tworzę plik kontekstowy i umieszczam go w katalogu CATALINA_HOME/conf/Catalina/localhost, ale jest on losowo usuwany co jakiś czas. Plik kontekstu ma nazwę attachments.xml, a jego zawartość przedstawiono poniżej. Czytałem również o wirtualnych hostach, ale jeśli rozumiem poprawnie, to wirtualny host nie jest tym, czego szukam. Używam wersji 6.0.18 serwera Apache Tomcat.

attachments.xml:

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

Odpowiedz

9

Spędziłem dużo więcej czasu nad tym i znaleźć rozwiązanie, które rozwiązuje losową usunięcie plików kontekście. Znalazłem ten fragment na stronie Apache w sekcji Host Configuration:

Można gniazdo jeden lub więcej Kontekst elementy wewnątrz tego elementu przyjmującego, każda reprezentuje inny internetowej aplikacji powiązanej z tym wirtualnego hosta.

Wirtualne gospodarze są przechowywane w server.xml pliku, do CATALINA_HOME \ konf. Tomcat jest skonfigurowany jako localhost jako domyślny host. Tak więc, jeśli dodamy zawartość attachments.xml z pierwszego postu, otrzymujemy następujące:

<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> 

To jest tak blisko jak można dostać się do definiowania aliasów podobne do serwera HTTP Apache, myślę.

+1

Istnieje pewne dziedziczne niebezpieczeństwo z tym związane. Zobacz moją odpowiedź, aby uzyskać więcej informacji. –

+0

Ogromne dzięki za to. Próbowałem znaleźć rozwiązanie na 1+ dzień. To zadziałało! –

6

Istnieje wiele opcji.

  1. Użyj Apache jako nakładka, delegując do tomcat przez mod_jk lub mod_proxy
  2. Podaj pobierania apletu w swojej aplikacji, obsługujących żądany plik
  3. Dodać do katalogu, który chcesz kocur dostarczyć aplikację internetową

każda ma pewne wady i zalety. Zdecydowanie preferuję pierwsze rozwiązanie z wielu powodów:

  • Moje główne powody dotyczą systemów unixoid, o których oczywiście nie mówisz: tylko root może wiązać porty mniejsze niż 1024, np. 80. W tym przypadku tomcat musiałby działać jako root (wiem, że istnieją mechanicy, które pozwalają użytkownikom wiązać się z niskimi portami, ale nigdy ich nie użyłem). Apache jest zwykle uruchamiany jako root, ale odrzuca te uprawnienia, gdy tylko port 80 zostanie powiązany.
  • Apache podobno jest o wiele lepszy w obsłudze statycznych zasobów niż tomcat (nigdy go nie mierzyłem, ale trudno w to uwierzyć).
  • Oczywiście umiesz tworzyć aliasy w apache - byłoby to trywialne, aby to zrobić.

O pobierania apletu:

ten sposób musiałbyś aplet służący swoje statycznych zasobów, które można wiązać z adresami URL „/ download/*” (na przykład w aplikacji, która obsługuje również plik dodane) można by zyskać:

  • musisz skonfigurować katalog, w którym pliki są przechowywane tylko raz
  • Jeśli potrzebujesz można łatwo wdrożyć kontroli uprawnień (np logowanie wymagane do pobierania)
  • Musisz wdrożyć tylko jedną całkowicie niezależną aplikację.
  • Serwlet pobierania jest trywialny - znajdź plik, ustaw jego nazwę i typ pliku w strumieniu wyjściowym i przesyłaj bajt po bajcie, a następnie zamknij strumień wyjściowy (pamiętaj, aby obsługiwać atrybuty takie jak "/download/../ ../../../etc/passwd "lub" /download/C:/WINDOWS/someimportantfile.xxx "), np. za pomocą konstruktora java.io.File, który pobiera katalog podstawowy jako oddzielny parametr.

Trzecia opcja ma kilka poważnych wad i otwiera cię na ataki, jeśli nie zachować szczególną ostrożność z nich:

  • Tomcat nie służy katalogach, ale webapps. W związku z tym "E:/upload/attachments" potrzebuje co najmniej katalogu o nazwie "WEB-INF", zawierającego "web.xml". Uważaj, aby nie zapewniać prawa zapisu do tego katalogu i pliku z przesłanej aplikacji internetowej. Dzięki temu przepisowi możesz pozwolić serwerowi tomcat obsługiwać katalog.
  • Jednak: Skonfiguruj plik web.xml, aby nie wyświetlał "* .jsp" jako jsp, w przeciwnym razie tomcat nie dostarczałby plików jsp, ale je wykonał. Wyobraź sobie, że ktoś przesyła "index.jsp" z <% System.exit(0); %> lub więcej złośliwą zawartością.

Jedna dodatkowa myśl: Nie potrzebujesz dodatkowej crosscontext="true". Oznaczałoby to, że aplikacja internetowa, którą wdrożysz tylko w celu obsługi plików, ma dostęp do innych aplikacji internetowych, np. jest w stanie nimi zarządzać lub uzyskać dostęp do swoich prywatnych danych. Zwykle nie potrzebujesz tego wcale, w przypadku twojego pytania zdecydowanie tego nie chcesz.

2

Zobacz pierwszą część mojego nowszego pytania, aby dowiedzieć się, jak to zrobić, edytując plik context.xml How do I add aliases to a Servlet Context in java?. Według wielu osób nie jest już konieczne (2012: Tomcat 6 lub 7) używanie Apache ze względu na wydajność z Tomcat do obsługi statycznej zawartości.

+2

Aby dodać do tego, co wskazał Paulus. Aliasy można teraz zdefiniować dla Tomcat 7. Dokumentacja [documenation] (http://tomcat.apache.org/tomcat-7.0-doc/config/context.html) powinna być warta zobaczenia, jeśli używasz tej wersji. Można je łączyć ze sobą 'aliases ="/shared =/[ścieżka do]/shared,/app1a =/[ścieżka do]/app1a "' – Chadwick

Powiązane problemy