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

Servlet 請求轉發 vs 重定向:forward/redirect 核心差異、參數傳遞與最佳選型指南

     編輯:Java 綜合教學

核心 API 對比

特性RequestDispatcher.forward()HttpServletResponse.sendRedirect()
實現機制服務器內部轉發,同一請求上下文客戶端瀏覽器發起新請求(HTTP 302)
地址欄變化**不變**,顯示原請求 URL**改變**,顯示目標 URL
請求對象同一 request/response 傳遞新請求,原 request 屬性丟失
作用範圍僅限當前 Web 應用內部資源任意 URL(跨應用、跨域、外部站點)
參數傳遞request.setAttribute()、URL 參數、Session僅 URL 參數、Session
性能單次網絡交互,較快兩次網絡交互(302 + 新請求),稍慢
刷新行為重複提交原請求(可能重複業務)重複目標請求(通常安全)

forward 詳細機制

// 必須使用相對路徑,以 / 開頭表示相對 Context Root
RequestDispatcher rd = request.getRequestDispatcher("/target.jsp");
rd.forward(request, response);

關鍵限制:必須在響應**未提交**前調用(即未 flush()、緩衝區未滿),否則拋 IllegalStateException。轉發前緩衝區內容自動清空。

sendRedirect 詳細機制

// 支持相對/絕對路徑
response.sendRedirect("/target.jsp");           // 相對 Context Root
response.sendRedirect("target.jsp");            // 相對當前請求 URI
response.sendRedirect("https://other.com/page"); // 外部絕對 URL

路徑解析規則:

  • 以 / 開頭 → 相對 Web 應用根路徑(Context Path)。
  • 不以 / 開頭 → 相對當前請求 URI 目錄。

同樣要求響應未提交**,調用後響應視為已提交,不得再寫入內容。

JSP 頁面中的轉發與重定向

方式語法地址欄request 傳遞執行時機
<jsp:forward><jsp:forward page="/target.jsp" />不變傳遞遇到標籤立即轉發,後續代碼不執行
response.sendRedirect()response.sendRedirect("target.jsp");改變不傳遞同主機:頁面執行完才跳轉;跨主機:類似新線程,後續代碼繼續但 response 操作無效
response.setHeader("Location", ...)手動設置 302 頭改變不傳遞頁面執行完才跳轉

JSP 共同限制:轉發/重定向前不能有 out.flush(),否則拋異常或失效。

選型決策樹

  1. **需保持請求屬性、表單數據、驗證錯誤回顯** → forward(如登錄失敗回登錄頁、表單驗證失敗回填)。
  2. **需改變 URL、防止表單重複提交(PRG 模式)、跳轉外部站點、跨應用** → redirect(如登錄成功跳首頁、支付回調、刪除操作後跳列表)。
  3. **僅內部邏輯跳轉、性能敏感** → forward。

PRG 模式(Post-Redirect-Get)最佳實踐

@PostMapping("/user/add")
public String addUser(UserForm form, RedirectAttributes redirectAttrs) {
    if (bindingResult.hasErrors()) {
        return "user/form"; // forward 回表單頁,保留錯誤信息
    }
    userService.save(form);
    redirectAttrs.addFlashAttribute("success", "添加成功"); // 閃存屬性,redirect 後一次可用
    return "redirect:/user/list"; // redirect 到列表頁,防止 F5 重複提交
}

結合 RedirectAttributes.addFlashAttribute() 實現 redirect 後攜帶一次性提示信息,完美解決「重定向需傳參」痛點。

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