SavedRequestAwareWrapper 繼承 SecurityContextHolderAwareRequestWrapper,新增 SavedRequest 屬性,實現「登入前保存目標 URL,登入後自動導向」的體驗。
Serializable,儲存完整請求資訊:URL、參數、Header、Method、Session ID 等。AbstractProcessingFilter.ACEGI_SAVED_REQUEST_KEY 存放於 Session。/download/123。FilterSecurityInterceptor 檢測無權限 → 拋出 AccessDeniedException。ExceptionTranslationFilter 捕獲 → 呼叫 sendStartAuthentication()。AbstractProcessingFilter 建立 SavedRequest 封裝原請求 → 存入 Session。AuthenticationProcessingFilter 驗證成功。successfulAuthentication() 呼叫 determineTargetUrl() 從 Session 取出 SavedRequest。sendRedirect() 導向原請求 /download/123,下載自動開始。SavedRequestAwareWrapper 覆寫 getRequestURI()、getParameterMap() 等方法:若 Session 存在 SavedRequest,則返回保存的值而非當前請求值,確保登入流程中 RequestDispatcher 轉發至登入頁時,登入頁仍能讀取到原目標 URL(用於 Hidden 欄位或顯示)。
// SavedRequestAwareWrapper.getRequestURI()
public String getRequestURI() {
if (savedRequest != null) {
return savedRequest.getRequestURI();
}
return super.getRequestURI();
}
文章以 CSDN 下載為例:未登入點下載 → 導向登入 → 登入後自動觸發下載。此即 SavedRequest 機制的經典應用。
SavedRequest 可序列化且跨節點同步。SavedRequest,防止 Session 膨脹。SavedRequest,避免殘留導向錯誤頁面。