使用RequestDispatcher
的转发方法可以访问WEB-INF下的那些页面。问题与sendRedirect
有什么关系?
答案 0 :(得分:6)
无法从Web应用程序外部访问WEB-INF
下的页面。
现在,由于使用HttpServletResponse#sendRedirect()
,客户端会创建一个新请求,因此该请求实际上是从浏览器发送的,因此您无法在WEB-INF
的路径中找到sendRedirect
。
如果是RequestDispatcher
,方法 - forward()
和include()
不会要求客户端创建新请求,而是使用相同的请求转发/或包含 Servlet Controller 的不同页面。这就是为什么您可以在WEB-INF
下提供文件的路径,因为您只能从Web应用程序内部访问它。
答案 1 :(得分:3)
RequestDispatcher
forward方法将请求的控制传递给另一个servlet或jsp,而不告诉客户端浏览器的请求调度。因此,请求调度完全在服务器端发生,因此您可以指定路径
sendRedirect
方法停止进一步处理请求并发送http状态代码" 301"和要在响应头中重定向到客户端浏览器的位置的URL。将重定向相关的HTTP标头发送到客户端浏览器后,服务器无法控制此请求。客户端浏览器看到http状态301然后它知道它应该向"位置"中的URL发送新请求。 http标头由服务器设置。客户端浏览器向新URL发送一个新请求,它将作为另一个正常请求由服务器处理。因此sendRedirect通过客户端浏览器处理,因此指定路径不起作用。
答案 2 :(得分:2)
WEB-INF
目录是Web应用程序的私有区域,WEB-INF
目录下的任何文件都无法通过指定URL直接从浏览器访问。 Web容器不会提供此目录的内容。但是,应用程序中的类/ servlet可以访问WEB-INF
目录的内容。
sendRedirect()
创建一个新浏览器request
。 重定向将标头发送回浏览器/客户端。此标头包含要由浏览器重定向的资源URL。然后浏览器向给定的URL发起新请求。
RequestDispatcher
这样的 include()/forward()
方法在内部运作。它包括/转发服务器内可用的资源。这种控制转移由容器内部完成,不涉及浏览器/客户端。
阅读Servlet spec 3.0 Directory Structure-10.5
名为“WEB-INF”的应用程序层次结构中存在一个特殊目录。这个 directory包含与文档中没有的应用程序相关的所有内容 应用程序的根目录。 大多数WEB-INF节点不属于公共文档 应用程序的树。除了在METAINF /中打包的静态资源和JSP之外 驻留在WEB-INF / lib目录中的JAR文件的资源, no other WEB-INF目录中包含的文件可以通过以下方式直接提供给客户端 容器。但是,WEB-INF目录的内容对于servlet代码是可见的 使用getResource和getResourceAsStream方法调用 ServletContext,可以使用RequestDispatcher调用公开。