2012-03-01 18 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