<a href="WEB-INF/jsp/test/test.jsp">test</a>
點擊連結返回 404,因為 WEB-INF 及其子目錄**受容器保護,禁止直接 HTTP 存取**。
web.xml、類庫、類檔、JSP 等敏感資源,Servlet 規範規定容器**不得**對外直接服務此目錄內容。// Servlet / Controller
request.getRequestDispatcher("/WEB-INF/jsp/test/test.jsp").forward(request, response);
// 必須映射到可公開的 Servlet 路徑
response.sendRedirect(request.getContextPath() + "/testAction");
// testAction Servlet 再 forward 到 WEB-INF JSP
// 專案結構
WebRoot/
test.jsp <-- 公開可直接存取
WEB-INF/
lib/
classes/
但會暴露內部結構,降低安全性。
WebRoot/
index.jsp
css/, js/, images/
WEB-INF/
web.xml
jsp/ <-- 所有 JSP 放這裡
test/
test.jsp
classes/
lib/
Controller (Servlet/Struts2/SpringMVC) 接收請求 → 業務邏輯 → forward("/WEB-INF/jsp/...")。
| 寫法 | 結果 | 原因 |
|---|---|---|
<a href="WEB-INF/..."> | 404 | 容器禁止直接存取 |
response.sendRedirect("WEB-INF/...") | 404 | 同左,瀏覽器請求被攔截 |
request.getRequestDispatcher("/WEB-INF/...").forward(...) | 成功 | 伺服器內部轉發,繞過容器攔截 |