2008-11-24 15 views
22

Tengo un directorio al que un proceso carga algunos archivos .pdf. Este proceso está fuera de mi control.Configurar enlaces simbólicos para un solo directorio en Tomcat

Necesito hacer esos archivos disponibles a través del sitio web usando Tomcat.

Tengo un directorio /var/lib/tomcat5/webapps/test1 disponible para la web y puedo ver los archivos con un navegador.

Así que creé un enlace simbólico que apunta al directorio con los archivos .pdf: /var/lib/tomcat5/webapps/test1/files/, pero no puedo ver nada en ese directorio.

¿Cómo puedo habilitar los enlaces simbólicos solo en el directorio test1? No quiero habilitar enlaces simbólicos en todas partes, solo para que el directorio con archivos .pdf esté disponible en la web.

Respuesta

46

Hay algunos problemas con la solución de crear un META-INF/context.xml que contiene <Context path="/myapp" allowLinking="true">

El mayor problema es que si existe un conf/context.xml, el allowLinking en el <Context> toma precedencia sobre a <Context> en un META-INF/context.xml. Y si el en el conf/context.xml no define explícitamente allowLinking, es lo mismo que decir allowLinking="false". (Consulte my answer a una pregunta de prioridad de contexto)

Para asegurarse de que su aplicación permita el enlace, debe decir <Context override="true" allowLinking="true" ...>.

Otro problema es que el path="/myapp" se ignora en un META-INF/context.xml. Para evitar confusiones, es mejor dejarlo fuera. La única vez que path en un <Context> tiene algún efecto está en el server.xml, y el official Tomcat docs recommend against poniendo <Context> s en un server.xml.

Finalmente, en lugar de un archivo myapp/META-INF/context.xml, recomiendo usar un archivo conf/Catalina/localhost/myapp.xml. Esta técnica significa que puedes mantener limpios los contenidos de tu META-INF, que son las entrañas de tu aplicación web; no me gusta arriesgar el desperdicio en las entrañas de mi aplicación web. :-)

+1

gran guardar ... gracias hombre. tuve que ponerlo en META-INF y agregar la anulación. (creo que no funciona en el WEB-INF?) – dev

+0

@ piotr-czapla: ¡Gracias por editar mi respuesta para arreglar el WEB-INF de META-INF! – netjeff

+0

¿Cómo se accederá a los archivos de esta ruta desde Java? Por ejemplo, si quisiera crear un objeto File para '/ var/lib/tomcat5/webapps/test1/files/example.pdf', ¿cuál sería la cadena de ruta dada al constructor? – beldaz

15

Crear un archivo en un directorio context.xml META-INF en su aplicación web que contiene:

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

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

</Context> 

más aquí: http://www.isocra.com/2008/01/following-symbolic-links-in-tomcat/

+0

Sí, todo lo que tenía que hacer era crear un archivo context.xml: /var/lib/tomcat5/webapps/test1/META -INF/context.xml Ese enlace fue muy útil. Gracias. –

+0

Gracias por esto. ¿Alguna idea de cómo configurar tomcat (6) para seguir siempre los enlaces simbólicos? –

+0

Las mismas técnicas funcionan para Tomcat 6.0 para seguir enlaces simbólicos. – netjeff

1

Lo hice de esta otra manera. Editar este otro archivo de configuración: apache-tomcat-7.0.33/conf/servidor.xml En anfitrión etiqueta que agregó:

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

lo tanto, puede acceso a través de: http://localhost/data

6

Sí sé que es una vieja pregunta, pero he encontrado una nueva solución, utilizando un montaje con el - -bind opción en lugar de un enlace simbólico, y Tomcat no necesita ninguna reconfiguración:

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

archivos mkdir

montaje --bind/ruta/a/reales/carga/directorio/archivos archivos

1

Hay 4 lugares donde Contexto puede vivir.

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

En el caso de tomcat, el atributo 8 allowlinking debe especificarse no en Contexto, sino en la etiqueta Resources. Mi tomcatdir/conf/context.xml se parece a esto

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

Esta solución funciona bien para mí ahora. Pero quiero compartir también el error que había cometido antes de llegar a esta solución.

Tenía recursos definidos tanto en tomcatdir/conf/server.xml como en tomcatdir/conf/context.xml. Y allowLinking = "true" se configuró solo en tomcatdir/conf/server.xml.

Lo que encontré fue que si no especifica allowLinking es igual a establecerlo en falso. Así que eliminé la etiqueta Resources de server.xml y la dejé solo tomcatdir/conf/context.xml con el atributo allowLinking = "true" en ella.

Cuestiones relacionadas