首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Acegi SavedRequestAwareWrapper 與 SavedRequest 機制深度解析

     編輯:Java 相關知識

SavedRequestAwareWrapper 繼承 SecurityContextHolderAwareRequestWrapper,新增 SavedRequest 屬性,實現「登入前保存目標 URL,登入後自動導向」的體驗。

一、SavedRequest 角色

  • 實作 Serializable,儲存完整請求資訊:URL、參數、Header、Method、Session ID 等。
  • Key:AbstractProcessingFilter.ACEGI_SAVED_REQUEST_KEY 存放於 Session。

二、完整流程

  1. 用戶訪問受保護資源 /download/123。
  2. FilterSecurityInterceptor 檢測無權限 → 拋出 AccessDeniedException。
  3. ExceptionTranslationFilter 捕獲 → 呼叫 sendStartAuthentication()。
  4. AbstractProcessingFilter 建立 SavedRequest 封裝原請求 → 存入 Session。
  5. 導向登入頁。
  6. 用戶提交登入表單 → AuthenticationProcessingFilter 驗證成功。
  7. successfulAuthentication() 呼叫 determineTargetUrl() 從 Session 取出 SavedRequest。
  8. sendRedirect() 導向原請求 /download/123,下載自動開始。

三、Wrapper 如何協助

SavedRequestAwareWrapper 覆寫 getRequestURI()、getParameterMap() 等方法:若 Session 存在 SavedRequest,則返回保存的值而非當前請求值,確保登入流程中 RequestDispatcher 轉發至登入頁時,登入頁仍能讀取到原目標 URL(用於 Hidden 欄位或顯示)。

四、關鍵原始碼片段

// SavedRequestAwareWrapper.getRequestURI()
public String getRequestURI() {
    if (savedRequest != null) {
        return savedRequest.getRequestURI();
    }
    return super.getRequestURI();
}

五、CSDN 下載案例複盤

文章以 CSDN 下載為例:未登入點下載 → 導向登入 → 登入後自動觸發下載。此即 SavedRequest 機制的經典應用。

六、實務注意

  • Session 集群環境需確保 SavedRequest 可序列化且跨節點同步。
  • 避免將大型請求體(如檔案上傳)存入 SavedRequest,防止 Session 膨脹。
  • 登出時應清除 Session 中的 SavedRequest,避免殘留導向錯誤頁面。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved