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

Java Web 頁面跳轉全解析:轉發 vs 重定向、登入流程、中間頁面作用

     編輯:程式設計疑難解答

四大跳轉方式對比

方式API/標籤地址列變化Request 域共享適用場景
請求轉發RequestDispatcher.forward()
<jsp:forward>
**不變****共享同一 Request**同一業務流程內跳轉(Controller → JSP、Servlet 間)
重定向response.sendRedirect()
<c:redirect>
**改變** (302 + Location)**新 Request**(舊 Request 失效)登入成功、表單提交後、跨應用/外部連結、防止重複提交 (PRG 模式)
JSP 包含<jsp:include>
<%@ include file="" %>
不變共享頁面片段復用(頁頭、頁尾、側邊欄)
HTML 連結/表單<a href="">
<form action="">
改變新 Request用戶主動導航、表單提交

登入流程標準模式(PRG: Post-Redirect-Get)

// LoginServlet.doPost()
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    User user = userService.authenticate(username, password);
    if (user != null) {
        // 1. 存入 Session
        HttpSession session = req.getSession();
        session.setAttribute("loginUser", user);
        // 2. 重定向到首頁/儀表板(PRG 核心)
        resp.sendRedirect(req.getContextPath() + "/dashboard");
    } else {
        // 失敗:轉發回登入頁,攜帶錯誤訊息
        req.setAttribute("error", "帳號或密碼錯誤");
        req.getRequestDispatcher("/login.jsp").forward(req, resp);
    }
}

為什麼登入成功要「重定向」而非「轉發」?

  1. 防止表單重複提交:轉發保留原 Request,用戶 F5 刷新會再次提交 POST,重定向後刷新只是 GET 請求首頁。
  2. 地址列顯示真實業務 URL(/dashboard 而非 /login),利於書籤、分享、瀏覽器歷史記錄。
  3. 清除請求參數:密碼等敏感資料不再留在 Request/URL 中。

中間頁面(顯示「登入成功,正在跳轉...」)的作用

**現代 Web 幾乎不需要**。傳統做法:

// 登入 Servlet → 中間 JSP (meta refresh / JS setTimeout) → 目標頁
// 中間頁面代碼:

// 或

**存在理由(歷史)**:

  • 給用戶視覺回饋(避免白屏等待)。
  • 執行耗時初始化(載入權限、購物車、推薦資料),中間頁面顯示進度。
  • 舊式同步框架無 AJAX,需頁面跳轉觸發後續邏輯。

**現代替代方案**:

  • AJAX 登入 + 前端路由跳轉:登入 API 返回 Token,前端存儲並 router.push('/dashboard'),無中間頁。
  • 後端直接重定向:sendRedirect 幾乎瞬間完成,中間頁面反而增加一次請求延遲。
  • Server-Sent Events / WebSocket 推送進度:真正需長時間初始化時,用長連接推送進度到前端。

總結

  • **同一流程內跳轉用轉發**,**結束流程/防重複提交用重定向**。
  • **登入成功必須重定向 (PRG)**,中間頁面在現代架構中**多餘且有害**(增加延遲、複雜度)。
  • 採用 **AJAX + 前端路由** 或 **直接重定向**,拋棄中間頁面模式。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved