2012-03-01 11 views
6

To jest moje pierwsze pytanie (więc bądźcie łagodni :)). Szukałem wszędzie i nie mogę znaleźć odpowiedzi na mój problem (również poszło trochę szalony w tym procesie).Apache Tomcat: Żądany zasób() nie jest dostępny (podczas uzyskiwania dostępu do zasobu, który powinien być dostępny).

Używam Tomcat 7 i najnowszego Eclipse IDE dla programistów Java EE (platforma Eclipse 3.7.2 i Java EE IDE 1.4.2). Pojawia się następujący błąd: "Żądany zasób() nie jest dostępny" podczas uzyskiwania dostępu do http://127.0.0.1:8080/myTest/WEB-INF/jsp/savename.jsp. Sprawdziłem wiele razy, że ten plik znajduje się na dysku w dokładnym folderze. Próbowałem uruchomić Tomcat wewnątrz Eclipse i wdrażanie wyeksportowanego .war w Tomcat. Za każdym razem pojawia się ten sam błąd.

Moje pliki:

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

Kiedy uruchamiam "http: // localhost/myTest" index.jsp zawsze działa poprawnie. Następnie używam

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

wewnątrz mojego index.jsp, aby przejść do GetName.html a także działa. Problem pojawia się w 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> 

po naciśnięciu przycisku złożyć w formie, przeglądarka przekierowuje do: http://127.0.0.1:8080/myTest/WEB-INF/jsp/savename.jsp i wyskakuje błąd.

Więc ja naprawdę nie rozumiem, dlaczego tak się dzieje ... Domyślnie Tomcat aplikacje działają doskonale ...

PS: Próbowałem również manualy nawigowania do plików:

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

ale również pojawia się błąd (nawet gdy idex.jsp nawiguje także GetName.html bez żadnych problemów) ..

Każda pomoc jest znacznie apreciated! Dzięki!

Odpowiedz

4

Nie można bezpośrednio przejść do żadnych plików/artefaktów umieszczonych w katalogu WEB-INF (dotyczy również META-INF). Jest to funkcja zabezpieczająca silnika serwletów: treść w WEB-INF jest chroniona i niedostępna z adresu "na zewnątrz" pod numerem. Poza tym każdy może czytać wrażliwe dane, takie jak konfiguracja aplikacji/bazy danych itp., Po prostu tworząc odpowiednie adresy URL.

Powodem, dla którego „jsp: forward” tag jest nadal w stanie uzyskać dostęp do plików w/w katalogu WEB-INF jest to, że do przodu wykonuje wewnętrznie na serwerze, czyli wniosek już przybył do silnika serwletów i index.jsp jest wykonywany, dlatego silnik serwletów spełnił swoje obowiązki bezpieczeństwa, a teraz jest autorem m.in. index.jsp jest odpowiedzialny za określenie, które pliki mają być dostępne.

PS
Oprócz używania znaczników "jsp: forward" można użyć dyrektywy include (dołączenie statyczne), np.

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

lub dołączony znacznik JSP (uwzględniany dynamicznie), np.

Różnice między tymi dwoma rodzajami można wyszukiwać w Google, dobre wyniki to np. 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

Dzięki człowiek! Ale problem nadal występuje ... Jak połączyć różne pliki w różnych folderach? Dlaczego formularz w pliku GetName.html nie może uzyskać dostępu do WEB-INF/jsp/savename.jsp? Jakie byłoby rozwiązanie? (z wyjątkiem umieszczania wszystkich plików w katalogu głównym ...) – MoD

+1

Przykro mi to mówić, ale ze zwykłymi stronami JSP nie ma innego rozwiązania. Dane formularza są wysyłane przez przeglądarkę, więc przeglądarka gromadzi adres URL i wysyła dane do serwera za pomocą tego adresu URL, a serwer mówi "NIE, nie można uzyskać dostępu do WEB-INF". Dlatego musisz umieścić * savename.jsp * w katalogu głównym lub innym katalogu w katalogu głównym, a także użyć tagów lub dyrektyw include do załadowania prawdziwej zawartości z plików w WEB-INF. – t0r0X

+3

Myślę, że wiem, co próbujesz osiągnąć: ochrona/ukrywanie wszystkich stron JSP i związanego z nimi kodu. Jak już powiedziałem, nie można tego zrobić za pomocą zwykłych stron JSP. Musisz zbudować serwlet lub filtr, który służy jako "brama" i jest zmapowany do URI nie w/poniżej WEB-INF, i który przekazuje żądania do twoich stron JSP wewnątrz WEB-INF. Wolałbym polecić użycie architektury oferującej takie możliwości, np. Wiosenne ramy MVC. Pozwól mi podać kilka wskazówek: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-features – t0r0X

Powiązane problemy