2008-11-24 9 views
22

J'ai un répertoire dans lequel un processus télécharge des fichiers .pdf. Ce processus est hors de mon contrôle.Configurer les liens symboliques pour un répertoire unique dans Tomcat

J'ai besoin de rendre ces fichiers disponibles sur le site Web en utilisant Tomcat.

J'ai un répertoire /var/lib/tomcat5/webapps/test1 disponible sur le web et je peux voir les fichiers avec un navigateur. Donc, j'ai créé un lien symbolique pointant vers le répertoire avec les fichiers .pdf: /var/lib/tomcat5/webapps/test1/files/, mais je ne vois rien dans ce répertoire.

Comment puis-je activer les liens symboliques dans le répertoire test1 uniquement? Je ne veux pas activer les liens symboliques partout, juste pour que le répertoire contenant les fichiers .pdf soit disponible sur le Web.

Répondre

46

Il y a quelques problèmes avec la solution de créer un META-INF/context.xml qui contient <Context path="/myapp" allowLinking="true">

Le plus gros problème est que si un conf/context.xml existe, le allowLinking dans le <Context> prend priorité sur un <Context> dans un META-INF/context.xml. Et si le conf/context.xml ne définit pas explicitement allowLinking, c'est la même chose que de dire allowLinking="false". (Voir my answer à une question de précédence du contexte)

Pour être sûr que votre application autorise la liaison, vous devez indiquer <Context override="true" allowLinking="true" ...>. Un autre problème est que le path="/myapp" est ignoré dans META-INF/context.xml. Pour éviter toute confusion, il est préférable de laisser tomber. La seule fois path dans un <Context> a un effet est dans le server.xml, et le official Tomcat docs recommend against mettant <Context> s dans un server.xml.

Enfin, au lieu d'un fichier myapp/META-INF/context.xml, je recommande d'utiliser un fichier conf/Catalina/localhost/myapp.xml. Cette technique signifie que vous pouvez garder le contenu de votre META-INF propre, ce qui est le courage de votre webapp - Je n'aime pas risquer de me balader dans les tripes de ma webapp. :-)

+1

grande sauvegarde .. merci l'homme. Je devais le mettre dans META-INF et ajouter le remplacement. (Je pense que cela ne fonctionne pas dans le WEB-INF?) – dev

+0

@ piotr-czapla: Merci d'avoir édité ma réponse pour corriger le WEB-INF à META-INF! – netjeff

+0

Comment accéder à un fichier de ce chemin à partir de Java? Par exemple, si je voulais créer un objet File dans '/ var/lib/tomcat5/webapps/test1/files/example.pdf', quelle serait la chaîne de chemin donnée au constructeur? – beldaz

15

Créez un fichier context.xml dans un répertoire META-INF dans votre application web contenant:

<?xml version="1.0" encoding="UTF-8"?> 

<Context path="/myapp" allowLinking="true"> 

</Context> 

plus ici: http://www.isocra.com/2008/01/following-symbolic-links-in-tomcat/

+0

Oui, tout ce que je devais faire était de créer un fichier context.xml: /var/lib/tomcat5/webapps/test1/META -INF/context.xml Ce lien était très utile. Je vous remercie. –

+0

Merci pour votre aide. Une idée de comment configurer tomcat (6) pour toujours suivre les liens symboliques? –

+0

Les mêmes techniques fonctionnent pour Tomcat 6.0 pour suivre les liens symboliques. – netjeff

1

Je l'ai fait de cette manière. Je modifie cet autre fichier de configuration: apache-tomcat-7.0.33/conf/serveur.xml Dans tag hôte I ajouté:

<Context path="/data" docBase="C:\datos" debug="0" reloadable="true" crossContext="false"/> 

Ainsi, vous pouvez accès via: http://localhost/data

6

Oui, je sais que c'est une vieille question, mais je l'ai trouvé une nouvelle solution, en utilisant monter avec le - l'option -bind au lieu d'un lien symbolique, et tomcat n'a pas besoin de reconfigurer:

cd/var/lib/tomcat5/webapps/test1/

fichiers mkdir

montage --bind/chemin/vers/réel/upload/répertoire/fichiers fichiers

1

Il y a 4 endroits où le contexte peut vivre.

  1. tomcatdir/conf/server.xml
  2. tomcatdir/conf/context.xml
  3. tomcatdir/conf/Catalina/localhost/appname.xml
  4. tomcatdir/webapps/appname/META-INF/context.xml

Dans le cas de Tomcat 8, l'attribut d'autorisation ne doit pas être spécifié dans le contexte mais dans la balise Resources. Mon tomcatdir/conf/context.xml ressemble à ceci

<Context> 
<WatchedResource>WEB-INF/web.xml</WatchedResource> 
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> 
<Resources allowLinking="true" cachingAllowed="true" cacheMaxSize="100000" /> 
</Context> 

Cette solution fonctionne très bien pour moi. Mais je veux partager aussi l'erreur que j'avais faite avant d'arriver à cette solution.

J'avais défini les ressources à la fois dans tomcatdir/conf/server.xml et dans tomcatdir/conf/context.xml. Et allowLinking = "true" a été défini uniquement dans tomcatdir/conf/server.xml.

Ce que j'ai trouvé était que si vous ne spécifiez pas allowLinking il est égal à le mettre à false. J'ai donc retiré la balise Resources de server.xml et je l'ai laissée seulement tomcatdir/conf/context.xml avec l'attribut allowLinking = "true".

Questions connexes