Java Web中请求转发时如何避免指向WEB-INF目录?
问题分析与解决方案
这个问题的核心在于静态包含的特性和转发路径的相对定位:
你使用<%@include file="isValidUser.jsp" %>是静态包含,它会把isValidUser.jsp的代码直接嵌入到当前调用它的页面中执行。如果调用它的页面本身存放在WEB-INF目录下,那么当执行request.getRequestDispatcher("index.jsp")时,这个相对路径会以当前页面所在的WEB-INF目录为基准,所以系统会去寻找/LogInSample/WEB-INF/index.jsp,而你的index.jsp显然在项目根目录,这就导致了404错误。
解决方法:使用绝对路径进行转发
把isValidUser.jsp中的转发路径改成以/开头的绝对路径,这样路径会以项目根目录为基准,而不是当前页面所在目录:
修改后的isValidUser.jsp代码:
<html> <% User u = (User) session.getAttribute("user"); if(u == null){ // 以/开头的路径指向项目根目录 request.getRequestDispatcher("/index.jsp").forward(request, response); } %> </html>
如果你的项目部署上下文路径可能变化(比如不是固定的/LogInSample),更通用的写法是结合上下文路径:
<html> <% User u = (User) session.getAttribute("user"); if(u == null){ String contextPath = request.getContextPath(); request.getRequestDispatcher(contextPath + "/index.jsp").forward(request, response); } %> </html>
补充说明
- 静态包含
<%@include%>会在编译阶段合并代码,执行时的上下文是调用页面的位置;而动态包含<jsp:include>是在运行时加载,上下文是被包含页面的位置,但这里的核心问题是转发路径,所以用绝对路径是最直接的解决方式。 - 注意
WEB-INF目录下的资源默认是不能直接通过浏览器访问的,所以你的index.jsp放在根目录是正确的做法,转发时必须指向正确的位置。
内容的提问来源于stack exchange,提问作者kristheman
相关产品推荐
相关产品推荐

