spring security使用自定義登陸界面後,不能返回到以前的請求界面的問題

昨天由於集成spring security oauth2,因此對以前spring security的配置進行了一些修改,而後就致使登陸後不能正確跳轉回被攔截的頁面,而是返回到localhost根目錄。web

開始覺得是被oauth2攔截了致使出了問題,可是security的攔截器是優先起做用的,因此這不可能。spring

最後實在無法只有打斷點調試找毛病(下圖爲spring security登陸後重定向至攔截前訪問的url的實現原理流程)瀏覽器

 

圖片是在這裏看到的https://blog.csdn.net/zy_cookie/article/details/49535413緩存

 

從圖上能夠看出保存 被攔截的request是在 這個類裏進行的cookie

HttpSessionRequestCachesession

在IDEA裏搜索這個類,在saveRequest方法設置一個斷點,而後進行調試url

調試發現當瀏覽器輸入權限限制的url時(如/admin/console),系統會調用saveRequest方法對當前request對象進行緩存(以下圖所示).net

 

 既然保存的是/admin/console,可是爲啥取出來的是/呢,繼續執行就發現問題了,系統又調用了一次saveRequest方法,而此次保存的request對象是「/」路徑的3d

也就是說以前保存的就是被這個給覆蓋了,經過源碼能夠發現,saveRequest方法中是把request對象緩存到session,並且key值爲靜態值(因而可知若是咱們想要自定義一些方法時能夠經過該key值取出保存的request對象,不過系統也提供了getRequst方法)調試

 

 

根據流程圖可知只有被攔截的請求才會被捕獲保存起來,因而我去檢查我webSercurityConfig,發現除了靜態資源其餘的資源全都須要驗證,也所以「/」根目錄被攔截了,把「/」添加到排除列表後問題解決

經過後續的調試發現「/」是由於我自定義的登陸頁面發出的該請求

 

值得注意的是spring security完成用戶登陸後跳轉會原頁面的處理是在

SavedRequestAwareAuthenticationSuccessHandler類裏面進行的,若是想要自定義登陸成功後的操做能夠繼承該類,重寫該方法

 

不過我當時寫的時候由於生成的代碼裏自動生成調用父類的該方法致使獲取不到saveRequest(就是下面這行)

緣由是在

SavedRequestAwareAuthenticationSuccessHandler類處理時,獲取到saveRequst後會對session中緩存的進行刪除

相關文章
相關標籤/搜索