2012-03-01 1367 views
6

這是我的第一個問題(所以請溫和:))。我到處尋找,找不到我問題的答案(在這個過程中也有點瘋狂)。Apache Tomcat:請求的資源()不可用(同時訪問應該可用的資源)

我爲Java EE開發人員(Eclipse平臺3.7.2和Java EE IDE 1.4.2)使用Tomcat 7和最新的Eclipse IDE。 所以,我得到這個錯誤:「請求的資源()不可用」,同時訪問http://127.0.0.1:8080/myTest/WEB-INF/jsp/savename.jsp。我已經檢查了很多次,這個文件是在確切的文件夾中的磁盤上。我試過在Eclipse內部運行Tomcat,並在Tomcat中部署導出的.war。每次彈出相同的錯誤。

我的文件:

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

當我運行的 「http://本地主機/ MYTEST」 的index.jsp始終正常運行。 然後我用

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

我的index.jsp內導航到前面教程的GetName.html並且還有效。 問題在前面教程的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> 

當我按下的形式提交按鈕,瀏覽器重定向到: http://127.0.0.1:8080/myTest/WEB-INF/jsp/savename.jsp和錯誤彈出。

所以,我真的不明白爲什麼會這樣......默認的Tomcat應用程序很好地工作......

附:我曾嘗試也manualy導航到文件:

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

但我也得到了錯誤(即使idex.jsp導航也沒有任何問題,前面教程的GetName.html)..

任何幫助很大apreciated! 謝謝!

回答

4

您不能直接導航到WEB-INF目錄下的任何文件/工件(對META-INF也有效)。這是servlet引擎的一項安全功能:WEB-INF下的內容受到保護,無法通過URL從「outside」訪問。否則,任何人都可以通過組裝恰當的URL來閱讀應用程序/數據庫配置等敏感細節。

之所以「的jsp:前鋒」的標籤依然能夠訪問文件在/ WEB-INF目錄下是前進在服務器上執行內部,即請求已經到達的servlet引擎和index.jsp被執行,因此servlet引擎已經履行了它的安全職責,現在是例如index.jsp負責決定哪些文件必須被訪問。

PS
除了使用「jsp:forward」標籤,您還可以使用include指令(static include),例如,

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

或包括JSP標籤(動態包括),例如,

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

這兩者之間的差異包括類型可以被谷歌搜索,好的結果將是例如。 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

感謝的人!但問題仍然存在......我如何鏈接不同文件夾內的不同文件?爲什麼GetName.html中的表單無法訪問WEB-INF/jsp/savename.jsp?解決方案是什麼? (除了將所有文件放在根目錄中......) – MoD 2012-03-01 18:11:49

+1

很抱歉地說,但是對於普通的JSP,沒有其他解決方案。表單數據由瀏覽器發送,因此瀏覽器會組裝URL並使用該URL將數據發送到服務器,並且服務器說「不,您無法進入WEB-INF」。因此,必須將* savename.jsp *放在根目錄或根目錄下的另一個目錄中,並使用包含標記或指令從WEB-INF下的文件加載實際內容。 – t0r0X 2012-03-01 18:36:00

+3

我想我知道你在努力實現什麼:保護/隱藏所有的JSP和相關的代碼。正如我所說的,不能用簡單的JSP來完成。您需要構建一個作爲「網關」的servlet或過濾器,並將其映射到不在/位於WEB-INF下的URI,並將請求轉發到WEB-INF中的JSP。我寧願推薦使用爲您提供這種功能的框架,例如Spring MVC框架。讓我給你一些指示:http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-features – t0r0X 2012-03-01 18:50:55