昨天因為集成spring security oauth2,所以對之前spring security的配置進行了一些修改,然后就導致登錄后不能正確跳轉回被攔截的頁面,而是返回到localhost根目錄。
開始以為是被oauth2攔截了導致出了問題,但是security的攔截器是優先起作用的,所以這不可能。
最后實在沒法只有打斷點調試找毛病(下圖為spring security登錄后重定向至攔截前訪問的url的實現原理流程)
圖片是在這里看到的https://blog.csdn.net/zy_cookie/article/details/49535413
從圖上可以看出保存 被攔截的request是在 這個類里進行的
HttpSessionRequestCache
在IDEA里搜索這個類,在saveRequest方法設置一個斷點,然后進行調試
調試發現當瀏覽器輸入權限限制的url時(如/admin/console),系統會調用saveRequest方法對當前request對象進行緩存(如下圖所示)
既然保存的是/admin/console,但是為啥取出來的是/呢,繼續執行就發現問題了,系統又調用了一次saveRequest方法,而這次保存的request對象是“/”路徑的
也就是說之前保存的就是被這個給覆蓋了,通過源碼可以發現,saveRequest方法中是把request對象緩存到session,而且key值為靜態值(由此可見如果我們想要自定義一些方法時可以通過該key值取出保存的request對象,不過系統也提供了getRequst方法)
根據流程圖可知只有被攔截的請求才會被捕獲保存起來,於是我去檢查我webSercurityConfig,發現除了靜態資源其他的資源全都需要驗證,也因此“/”根目錄被攔截了,把“/”添加到排除列表后問題解決
通過后續的調試發現“/”是因為我自定義的登錄頁面發出的該請求
值得注意的是spring security完成用戶登錄后跳轉會原頁面的處理是在
SavedRequestAwareAuthenticationSuccessHandler類里面進行的,如果想要自定義登錄成功后的操作可以繼承該類,重寫該方法
不過我當時寫的時候因為生成的代碼里自動生成調用父類的該方法導致獲取不到saveRequest(就是下面這行)
原因是在
SavedRequestAwareAuthenticationSuccessHandler類處理時,獲取到saveRequst后會對session中緩存的進行刪除