2012-03-01 41 views
6

Esta es mi primera pregunta aquí (así que sea gentil :)). He buscado en todas partes y no puedo encontrar la respuesta a mi problema (también se volvió un poco loco en el proceso).Apache Tomcat: El recurso solicitado() no está disponible (mientras se está accediendo al recurso que debería estar disponible)

Estoy utilizando Tomcat 7 y el último Eclipse IDE para desarrolladores de Java EE (plataforma Eclipse 3.7.2 y Java EE IDE 1.4.2). Entonces, aparece este error: "El recurso solicitado() no está disponible" al acceder al http://127.0.0.1:8080/myTest/WEB-INF/jsp/savename.jsp. He comprobado muchas veces que este archivo está en el disco en la carpeta exacta. Intenté ejecutar Tomcat dentro de Eclipse y desplegar .war exportado en Tomcat. Cada vez que aparece el mismo error.

Mis archivos:

myTest/index.jsp 
myTest/WEB-INF/html/GetName.html 
myTest/WEB-INF/jsp/savename.jsp 

Cuando corro "http: // localhost/myTest" index.jsp siempre se ejecuta correctamente. Luego uso

"<jsp:forward page="WEB-INF/html/GetName.html"></jsp:forward>" 

dentro de mi index.jsp para navegar a GetName.html y que también funciona. El problema aparece en GetName.html:

<form action='WEB-INF/jsp/savename.jsp' method="post" > 
What's your name? <INPUT TYPE=TEXT NAME=username SIZE=20> 
<P><INPUT TYPE=SUBMIT> 
</form> 

cuando se presiona botón de enviar el formulario, el navegador vuelve a dirigir a: http://127.0.0.1:8080/myTest/WEB-INF/jsp/savename.jsp y el error aparece.

Así que realmente no entiendo por qué ocurre esto ... Por defecto aplicaciones Tomcat funcionan perfectamente ...

P. S. He intentado también manualy navegar a los archivos:

http://127.0.0.1:8080/myTest/WEB-INF/html/GetName.html 
http://127.0.0.1:8080/myTest/WEB-INF/jsp/savename.jsp 

pero también obtener el error (incluso cuando idex.jsp también se desplaza a GetName.html sin ningún problema) ..

Cualquier ayuda es muy apreciada! ¡Gracias!

Respuesta

4

No puede navegar directamente a ningún archivo/artefacto colocado en el directorio WEB-INF (también válido para META-INF). Esta es una característica de seguridad del motor de servlet: el contenido en WEB-INF está protegido y no se puede acceder desde "afuera" a través de URL. De lo contrario, cualquiera podría leer detalles confidenciales como la configuración de la aplicación/base de datos, etc. simplemente al armar las URL apropiadas.

La razón por la que "jsp: forward" etiqueta es todavía capaz de acceder a los archivos en/en el directorio WEB-INF es que el delantero realiza internamente en el servidor, es decir, la solicitud ya ha llegado al motor servlet y index.jsp se ejecuta, por lo tanto, el motor de servlet ha cumplido sus deberes de seguridad y ahora el autor de, por ejemplo, index.jsp es responsable de decidir a qué archivos se debe acceder.

PS
Además de usar las etiquetas "jsp: forward", puede usar la directiva include (estática incluida), p.

<%@ include file=”/WEB-INF/dir/file.extension” %> 

o la etiqueta incluir JSP (dynamic include), p.

<jsp:include page=”/WEB-INF/dir/file.extension” /> 

Las diferencias entre estos dos tipos de inclusión se pueden buscar en Google, buenos resultados serían, por ej. http://java.sun.com/products/jsp/tags/11/syntaxref117.html
http://java.sun.com/products/jsp/tags/11/syntaxref1112.html
http://www.coderanch.com/how-to/java/IncludesActionDirective
http://docs.oracle.com/cd/B14099_17/web.1012/b14014/keydev.htm#i1005631

+0

Gracias hombre! Pero el problema aún persiste ... ¿Cómo puedo vincular diferentes archivos dentro de diferentes carpetas? ¿Por qué el formulario en GetName.html no puede acceder a WEB-INF/jsp/savename.jsp? ¿Cuál sería la solución? (excepto poniendo todos los archivos en el directorio raíz ...) – MoD

+1

Lamento decirlo, pero con los JSP simples no hay otra solución. El navegador envía los datos del formulario, de modo que el navegador ensambla la URL y envía los datos al servidor utilizando esa URL, y el servidor dice "NO, no puede ingresar a WEB-INF". Por lo tanto, debe poner * savename.jsp * en el directorio raíz, u otro directorio debajo del directorio raíz, y usar incluir etiquetas o directivas para cargar el contenido real desde archivos en WEB-INF. – t0r0X

+3

Creo que sé lo que intenta lograr: proteger/ocultar todos los JSP y el código relacionado. Como dije, eso no se puede hacer con JSP simples. Debe crear un servlet o un filtro que sirva como "puerta de enlace" y se asigne a un URI que no esté en/debajo de WEB-INF, y que reenvíe las solicitudes a sus JSP dentro de WEB-INF. Prefiero recomendar el uso de un marco que le ofrezca tales capacidades, como p. Marco Spring MVC. Déjame darte algunos consejos: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-features – t0r0X

Cuestiones relacionadas