當需將使用者導向新網址 (如舊網址遷移、登入後跳轉、錯誤頁面) 時,JSP 提供兩種主要重導向方式。
response.sendRedirect("https://example.com/new-page");
Location 標頭response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); // 302
response.setHeader("Location", "https://example.com/new-page");
等同於 sendRedirect(),但可自訂狀態碼 (如 301 永久移動、307 暫時重導向保持方法)。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
// 假設從 Session 判斷是否登入
Boolean loggedIn = (Boolean) session.getAttribute("loggedIn");
if (loggedIn == null || !loggedIn) {
// 未登入 → 導向登入頁,並帶上原網址供登入後返回
String target = request.getRequestURI();
String query = request.getQueryString();
if (query != null) target += "?" + query;
response.sendRedirect("login.jsp?redirect=" + java.net.URLEncoder.encode(target, "UTF-8"));
return; // 重要:終止後續輸出
}
%>
<!DOCTYPE html>
<html><head><title>會員專區</title></head>
<body>
<h1>歡迎會員</h1>
<p>這是受保護的內容...</p>
</body></html>
| 特性 | 重導向 (Redirect) | 轉發 (Forward) |
|---|---|---|
| HTTP 互動 | 兩次請求 (302 + 新請求) | 單次請求 (伺服器內部) |
| 瀏覽器網址 | 改變為新網址 | 保持原網址 |
| Request 物件 | 新建立,原屬性遺失 | 共用同一個,屬性保留 |
| 目標範圍 | 同網域、跨網域皆可 | 僅限同一 Web 應用內部 |
| 適用場景 | 表單送出後 (PRG 模式)、跨域、永久遷移 | 頁面組合、權限檢查後內部跳轉 |
防止表單重複送出的標準模式:
process.jspprocess.jsp 處理資料後 response.sendRedirect("result.jsp")result.jsp 顯示結果sendRedirect() 必須在 out.write()、HTML 標籤、空白字元之前,否則拋出 IllegalStateException。request.getContextPath() 組合絕對路徑:response.sendRedirect(request.getContextPath() + "/member/profile.jsp");SC_MOVED_PERMANENTLY,搜尋引擎會更新索引。