2012-03-01 1 views
6

Questa è la mia prima domanda qui (in modo da essere gentile :)). Ho cercato ovunque e non riesco a trovare la risposta al mio problema (sono anche andato un po 'pazzo nel processo).Apache Tomcat: La risorsa richiesta() non è disponibile (mentre acessing la risorsa che dovrebbe essere disponibile)

sto utilizzando Tomcat 7 e ultima Eclipse IDE per sviluppatori Java EE (piattaforma Eclipse 3.7.2 e IDE Java EE 1.4.2). Così, ottengo questo errore: "La risorsa richiesta() non è disponibile" durante l'accesso http://127.0.0.1:8080/myTest/WEB-INF/jsp/savename.jsp. Ho controllato molte volte che questo file si trova sul disco nella cartella esatta. Ho provato a eseguire Tomcat all'interno di Eclipse e a distribuire il file .war esportato in Tomcat. Ogni volta che compare lo stesso errore.

miei file:

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

Quando corro "http: // localhost/myTest" index.jsp corre sempre in modo corretto. allora io uso

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

dentro la mia index.jsp per navigare GetName.html e che funziona anche. Il problema compare in 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> 

quando si preme pulsante di invio in forma, il browser reindirizza a: http://127.0.0.1:8080/myTest/WEB-INF/jsp/savename.jsp e l'errore si apre.

Così ho davvero non capisco perché questo sta accadendo ... Difetto applicazioni Tomcat funzionano perfettamente ...

P.S. Ho provato anche manualy la navigazione verso i file:

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

ma anche ottenere l'errore (anche se idex.jsp naviga anche GetName.html senza problemi) ..

Ogni aiuto è molto apprezzata! Grazie !!

risposta

4

Non si può direttamente accedere a tutti i file/manufatti posti sotto directory WEB-INF (valido anche per META-INF). Questa è una caratteristica di sicurezza del motore servlet: contenuti sotto WEB-INF è protetta e non accessibile da "fuori" tramite URL. Altrimenti, chiunque potrebbe leggere dettagli sensibili come la configurazione di applicazioni/database, ecc. Semplicemente assemblando gli URL appropriati.

Il motivo per cui la "jsp: forward" tag è ancora in grado di accedere ai file in/sotto directory WEB-INF è che l'attaccante esegue internamente sul server, vale a dire la richiesta è già arrivata al motore servlet e index.jsp viene eseguito, quindi il motore servlet ha soddisfatto i suoi compiti di sicurezza e ora l'autore di es index.jsp è responsabile per decidere quali file devono accedere.

PS
Oltre a utilizzare "jsp: forward" tag, è possibile utilizzare la direttiva include (statici includono), ad esempio,

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

o il tag JSP include (include dinamico), ad es.

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

Le differenze tra questi due includono tipi possono essere Googled, buoni risultati sarebbero esempio 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

Grazie uomo! Ma il problema persiste ... Come posso collegare diversi file all'interno di cartelle diverse? Perché il modulo nel GetName.html non può accedere a WEB-INF/jsp/savename.jsp? Quale sarebbe la soluzione? (eccetto mettere tutti i file nella directory principale ...) – MoD

+1

Mi spiace dirlo, ma con semplici JSP non esiste un'altra soluzione. I dati del modulo vengono inviati dal browser, quindi il browser assembla l'URL e invia i dati al server utilizzando tale URL, e il server dice "NO, non puoi accedere a WEB-INF". Pertanto devi mettere * savename.jsp * nella directory root, o un'altra directory nella directory root, e usare i tag o le direttive include per caricare il contenuto reale dai file sotto WEB-INF. – t0r0X

+3

Penso di sapere cosa stai cercando di ottenere: proteggere/nascondere tutti i JSP e il codice relativo. Come ho già detto, non si può fare con semplici JSP. È necessario creare un servlet o un filtro che funge da "gateway" ed è mappato su un URI non in/sotto WEB-INF e che inoltra le richieste ai JSP all'interno di WEB-INF. Preferisco raccomandare l'uso di un framework che offre tali capacità, come ad es. Quadro MVC primaverile. Permettetemi di darvi alcuni suggerimenti: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-features – t0r0X