首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JSP a 標籤無法跳轉 WEB-INF 目錄:請求轉發與重定向機制解析

     編輯:程式設計綜合問答

現象

<a href="WEB-INF/jsp/test/test.jsp">test</a> 

點擊連結返回 404,因為 WEB-INF 及其子目錄**受容器保護,禁止直接 HTTP 存取**。

核心原理

  • WEB-INF:儲存 web.xml、類庫、類檔、JSP 等敏感資源,Servlet 規範規定容器**不得**對外直接服務此目錄內容。
  • a 標籤:瀏覽器發起 GET 請求,容器攔截並拒絕。

正確跳轉方式

1. 請求轉發 - 伺服器端內部跳轉 (URL 不變)

// Servlet / Controller
request.getRequestDispatcher("/WEB-INF/jsp/test/test.jsp").forward(request, response);

2. 重定向 - 瀏覽器端跳轉 (URL 改變)

// 必須映射到可公開的 Servlet 路徑
response.sendRedirect(request.getContextPath() + "/testAction"); 
// testAction Servlet 再 forward 到 WEB-INF JSP

3. 將 JSP 移出 WEB-INF (不推薦)

// 專案結構
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(...)成功伺服器內部轉發,繞過容器攔截
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved