起初並沒有遇到什么困難,用Shiro的session管理來實現,使用的sessionDao層實現主要用的還是RedisSessionDAO。登錄認證一切OK。但是當我去修改緩存時候,需要從session當中將對象的屬性取出來的時候(此時為Object類型),再轉成對應的類型就發生了類型轉換異常(不是同一類型)。
上幾張圖說明我的問題。
這里的這個 objValue
拿到的實際上也是session中緩存的用戶的信息。
從上兩幅圖我們可以看到,這兩個是屬於同一類型的。
但是實際上在 Debug
調試 objValue instanceof User
這段代碼時候,其結果卻是 false
,出乎了我的意料。
然后我去掉 objValue instanceof User
這段代碼,讓程序進入這個判斷執行語句 User user = (User) objValue
就出現了以下錯誤。
我到這個異常的時候,我腦海中第一個想的就是:我的親爸爸不是我親爸爸?
分析
嘗試了一系列的測試都無果后,原本已經打算放棄了。想着從 shiro session 中取出來的對象實際上都是經過 redis 的反序列化之后取出來的,就順着思考會不會是類加載的問題。
查了一下之后,發現我項目啟動時候加載項目當中的類所使用到的加載器是 org.springframework.boot.devtools.restart.classloader.RestartClassLoader
, 這是因為之前在項目當中引入了 spring-boot-devtools
這個熱部署包來提高效率。而我從 shiro session 取對象時候所用到的類加載器並不是這個,而是 sun.misc.Launcher.AppClassLoader
,從而導致我的類型的轉換的異常。
解決方法
1. 不使用 spring-boot-devtools
熱部署
2.在 resources
目錄下面創建 META_INF
文件夾,然后創建 spring-devtools.properties
文件,文件加上類似下面的配置:
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar