
jsp 文件置于 web-inf 目录下可提升安全性,但会因容器默认禁止直接访问而引发 404 错误;需通过 web.xml 显式声明 servlet 映射或改用 servlet 转发,才能正确访问受保护的 jsp。
jsp 文件置于 web-inf 目录下可提升安全性,但会因容器默认禁止直接访问而引发 404 错误;需通过 web.xml 显式声明 servlet 映射或改用 servlet 转发,才能正确访问受保护的 jsp。
在 Java Web 应用中,将 JSP 页面(如 login.jsp)放在 WEB-INF/view/jsp/ 目录下是一种推荐的安全实践——它能有效防止用户绕过控制器直接请求 JSP,避免业务逻辑被跳过或敏感数据泄露。然而,这种布局会带来一个常见陷阱:浏览器直接访问 /WEB-INF/view/jsp/login.jsp 将始终返回 HTTP 404 —— 并非文件不存在,而是 Servlet 容器(如 Tomcat)主动拒绝服务,这是由规范强制要求的安全机制。
你当前的 index.jsp 中使用了
✅ 正确做法是:不重定向(redirect),而应转发(forward) —— 即由服务器端内部跳转,不暴露真实路径。最简洁可靠的方案是配置 web.xml 中的
<!-- src/main/webapp/WEB-INF/web.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 将 /login 请求映射到受保护的 login.jsp -->
<servlet>
<servlet-name>LoginPage</servlet-name>
<jsp-file>/WEB-INF/view/jsp/login.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>LoginPage</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>随后,修改 index.jsp,使用
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <jsp:forward page="/login"/>
⚠️ 注意事项:
是服务器内部操作,URL 地址栏不会变化,且能访问 WEB-INF 下资源; 和 response.sendRedirect() 均触发客户端新请求,无法访问 WEB-INF; - 若使用 Servlet 作为入口(更推荐),应在 Servlet 中调用 request.getRequestDispatcher("/WEB-INF/view/jsp/login.jsp").forward(request, response);;
- Maven 项目中请确保 web.xml 位于 src/main/webapp/WEB-INF/,且 maven-war-plugin 已正确打包;
- Jakarta EE 9+(如你使用的 jakarta.servlet-api:5.0.0)已迁移到 jakarta.* 命名空间,但 web.xml DTD/XSD 版本仍兼容 4.0,无需升级至 5.0(目前无标准 web-app_5_0.xsd)。
总结:安全与可用性并不冲突——只要理解“重定向 vs 转发”的本质差异,并通过 web.xml 或 Servlet 正确桥接请求与受保护视图,即可在保障 WEB-INF 安全性的同时,实现平滑的页面导航。


















