为什么使用sendRedirect方法无法访问WEB-INF下的JSP页面?

时间:2013-07-23 09:59:18

标签: java jsp

使用RequestDispatcher的转发方法可以访问WEB-INF下的那些页面。问题与sendRedirect有什么关系?

3 个答案:

答案 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调用公开。