典型錯誤代碼
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
if (!authenticated) {
response.sendRedirect("/login");
// 缺少 return false; → 繼續執行後續代碼,可能再次提交響應
}
return true;
}
修復
if (!authenticated) {
response.sendRedirect("/login");
return false; // 關鍵:攔截器鏈終止,防止二次提交
}
原理
sendRedirect 設置狀態碼 302 + Location 頭,不立即提交響應體。
- 若方法繼續執行,Controller 可能渲染視圖、寫入響應體 → 響應已提交。
- 再次調用
sendRedirect 或 forward 即拋異常。
檢查清單
- 攔截器
preHandle 重定向後 必須 return false。
- Controller 方法重定向後 return null 或 void 方法直接 return。
- 檢查是否有
Filter、Aspect 在重定向後繼續寫響應。