1

WEB-INF 下的那些页面可以使用 forward 方法访问RequestDispatcher。怎么了sendRedirect

4

3 回答 3

7

WEB-INF无法从 Web 应用程序外部访问下面的页面。

现在,由于使用HttpServletResponse#sendRedirect(),客户端创建了一个新请求,因此该请求实际上是从浏览器发送的,因此您无法WEB-INFsendRedirect.

在这种情况下RequestDispatcher,方法 -forward()include(), 不会要求客户端创建新请求,而是使用相同的请求来转发/包含与最可能的Servlet 控制器不同的页面。这就是为什么您可以在 下提供文件的路径WEB-INF,因为您只能从 Web 应用程序内部访问它。

于 2013-07-23T10:04:28.087 回答
3

RequestDispatcherforward 方法将请求的控制权传递给另一个 servlet 或 jsp,而不告诉任何关于请求分派到客户端浏览器的信息。因此请求调度完全发生在服务器端,因此您可以指定路径

sendRedirect方法停止对请求的进一步处理,并在响应标头中发送 http 状态代码“301”和要重定向到客户端浏览器的位置的 URL。将重定向相关的 HTTP 标头发送到客户端浏览器后,服务器无法控制此请求。客户端浏览器看到 http 状态 301,然后它知道它应该向服务器设置的“Location”http 标头中的 url 发送一个新请求。客户端浏览器向新的 URL 发送一个新的请求,它会被服务器作为另一个普通请求来处理。因此 sendRedirect 是通过客户端浏览器处理的,因此指定路径不起作用。

于 2013-07-23T10:10:38.440 回答
2

WEB-INF目录是 Web 应用程序的私有区域,目录下的任何文件WEB-INF都不能通过指定 URL 直接从浏览器访问。Web 容器不会提供此目录的内容。但是,WEB-INF应用程序中的类/servlet 可以访问目录的内容。

sendRedirect()创建一个新的浏览器request重定向将标头发送回浏览器/客户端。此标头包含要由浏览器重定向的资源 url。然后浏览器向给定的 url 发起一个新的请求。

RequestDispatcherinclude()/forward()内部工作的方法。它包括/转发到发出呼叫的服务器中可用的资源。这种控制转移是由容器内部完成的,不涉及浏览器/客户端。

阅读Servlet 规范 3.0 Directory Structure-10.5

应用程序层次结构中存在一个名为“WEB-INF”的特殊目录。此目录包含与应用程序相关但不在应用程序文档根目录中的所有内容。大多数 WEB-INF 节点不是应用程序的公共文档树的一部分。除了静态资源和打包在 WEB-INF/lib 目录下的 JAR 文件的 METAINF/ 资源中的 JSP 之外,WEB-INF 目录中包含的其他文件不能由容器直接提供给客户端。但是,WEB-INF 目录的内容对于使用 ServletContext 上的 getResource 和 getResourceAsStream 方法调用的 servlet 代码是可见的,并且可以使用 RequestDispatcher 调用公开。

于 2013-07-23T10:04:50.610 回答