Apache Tomcat:请求的资源()不可用(同时访问应该可用的资源)

MoD*_*MoD 6 html forms jsp tomcat tomcat7

这是我的第一个问题(所以要温柔:)).我到处寻找,无法找到问题的答案(在此过程中也有点疯狂).

我正在为Java EE开发人员使用Tomcat 7和最新的Eclipse IDE(Eclipse平台3.7.2和Java EE IDE 1.4.2).所以,我得到这个错误:"访问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
Run Code Online (Sandbox Code Playgroud)

当我运行"http:// localhost/myTest"时,index.jsp总是正常运行.然后我用

"<jsp:forward page="WEB-INF/html/GetName.html"></jsp:forward>"
Run Code Online (Sandbox Code Playgroud)

在我的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>
Run Code Online (Sandbox Code Playgroud)

当我按下表单中的提交按钮时,浏览器会重定向到:http://127.0.0.1: 8080/myTest/WEB-INF/jsp/suname.jsp并弹出错误.

所以我真的不明白为什么会发生这种情况......默认的Tomcat应用程序运行良好......

PS我也试过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
Run Code Online (Sandbox Code Playgroud)

但我也得到错误(即使当idex.jsp也导航到GetName.html没有任何问题)..

任何帮助都是非常有用的!谢谢!!

t0r*_*r0X 4

您无法直接导航到 WEB-INF 目录下的任何文件/工件(对 META-INF 也有效)。这是 servlet 引擎的一项安全功能:WEB-INF 下的内容受到保护,无法通过 URL 从“外部”访问。否则,任何人都可以通过组合适当的 URL 来读取应用程序/数据库配置等敏感详细信息。

\n\n

“jsp:forward”标签仍然能够访问WEB-INF目录下的文件的原因是转发是在服务器内部执行的,即请求已经到达servlet引擎并执行index.jsp,因此servlet 引擎已经履行了它的安全职责,现在index.jsp 的作者负责决定必须访问哪些文件。

\n\n

PS
除了使用“jsp:forward”标签之外,您还可以使用 include 指令(静态包含),例如

\n\n
<%@ include file=\xe2\x80\x9d/WEB-INF/dir/file.extension\xe2\x80\x9d %>\n
Run Code Online (Sandbox Code Playgroud)\n\n

或包含 JSP 标签(动态包含),例如

\n\n
<jsp:include page=\xe2\x80\x9d/WEB-INF/dir/file.extension\xe2\x80\x9d />\n
Run Code Online (Sandbox Code Playgroud)\n\n

这两种包含类型之间的差异可以通过谷歌搜索,好的结果是例如\n http://java.sun.com/products/jsp/tags/11/syntaxref117.html
\n http://java.sun.com /products/jsp/tags/11/syntaxref1112.html
\n http://www.coderanch.com/how-to/java/InincludesActionDirective
\n http://docs.oracle.com/cd/B14099_17/web.1012 /b14014/keydev.htm#i1005631

\n

  • 我想我知道您想要实现什么:保护/隐藏所有 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 (3认同)