Filter 中 `response.sendRedirect("second.jsp")`,但 Console 仍輸出 `doFilter----first---end`,看似「重定向後仍繼續執行」。
重定向是客戶端行為:`sendRedirect` 只是在 HTTP 回應中設定 `Location` 標頭與 302 狀態碼,**伺服器端程式碼繼續執行完畢**,才將回應送回瀏覽器。瀏覽器收到 302 **再** 發起新請求到 `second.jsp`,觸發第二次 Filter 鏈。
請求 first.jsp
│
▼
Filter.doFilter (first)
│ ├─ chain.doFilter(req, resp) → Servlet/JSP 執行
│ ├─ resp.sendRedirect("second.jsp") // 只是設定 Header
│ ├─ System.out.println("doFilter----first---end") // 繼續執行!
│ └─ 方法返回,Container 發送 302 回應
▼
瀏覽器收到 302 Location: second.jsp
│
▼
請求 second.jsp (新請求!)
│
▼
Filter.doFilter (second) // 再次進入 Filter
│ ...
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
if (shouldRedirect(request)) {
response.sendRedirect("second.jsp");
return; // 【關鍵】直接 return,不再呼叫 chain.doFilter,也不執行後續程式碼
}
chain.doFilter(request, response); // 正常通過
// 後續 log 等...
}