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

Servlet 請求轉發與重定向深度解析:核心差異、代碼實現與最佳實踐

     編輯:Java 綜合教學

請求轉發 vs 重定向:核心差異一覽

特性請求轉發重定向
處理機制容器內部調用,同一請求瀏覽器發起新請求
URL 變化不變變為目標 URL
Request 域共享(屬性保留)新 Request(原屬性失效)
速度較快較慢(多一次網絡往返)
適用場景同一 Web 應用內部跳轉跨應用、登錄後跳轉、防止表單重復提交

重定向:三種實現方式

// 1. 原始方式
response.setStatus(302);
response.setHeader("Location", "/target");

// 2. 快捷方式(推薦)
response.sendRedirect("/target");

// 3. 額外方式
response.setHeader("Refresh", "0;url=/target");
// 或 JSP 標簽
<c:redirect url="/target"/>

請求轉發:四種獲取 Dispatcher 的方式

// 1. ServletContext 級別(跨 ServletContext 需配置 crossContext)
getServletContext().getRequestDispatcher("/target").forward(req, resp);

// 2. Request 級別(相對當前路徑)
request.getRequestDispatcher("/target").forward(req, resp);

// 3. PageContext(JSP 頁面中常用)
pageContext.forward("/target");

// 4. JSP 動作標簽
<jsp:forward page="/target"/>

核心原理圖解

轉發:Client → Servlet A → (容器內部) → Servlet B → Client(一次請求響應)
重定向:Client → Servlet A → (302 + Location) → Client → Servlet B → Client(兩次請求響應)

最佳實踐建議

  • 同模塊業務流程跳轉優先用 轉發,保持請求數據、減少網絡開銷。
  • 登錄成功、權限不足、跨應用跳轉、需改變 URL 時使用 重定向。
  • 重定向後若需傳遞數據,可用 Session、閃存或 URL 參數。
  • 避免在轉發鏈中修改 Response Header/Body,防止 IllegalStateException。

理解這兩者的本質差異,能幫你在設計 Controller 層流程時做出更合理的選擇,避免常見的「Request 屬性丟失」「表單重復提交」等坑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved