【SpringBoot】 整合 Shiro 過程當中遇到奇怪的類型轉換問題

遇到問題

  最近在忙着從新給公司的系統搭建框架,用了 SpringBoot,整合了 Shrio 來作用戶的認證和受權,也引入了Mybatis 的通用插件等等。
  起初並無遇到什麼困難,用 Shiro 的 session 管理來實現,使用的 sessionDao 層實現主要用的仍是 RedisSessionDAO。登陸認證一切OK。可是當我去修改緩存時候,須要從 session 當中將對象的屬性取出來的時候(此時爲 Object 類型),再轉成對應的類型就發生了類型轉換異常(不是同一類型)。
  上幾張圖說明個人問題。
  這裏寫圖片描述
  這裏的這個 objValue 拿到的實際上也是 session 中緩存的用戶的信息。
  這裏寫圖片描述
  從上兩幅圖咱們能夠看到,這兩個是屬於同一類型的。
  這裏寫圖片描述
  可是實際上在 Debug 調試 objValue instanceof User 這段代碼時候,其結果倒是 false ,出乎了個人意料。
  而後我去掉 objValue instanceof User 這段代碼,讓程序進入這個判斷執行語句 User user = (User) objValue 就出現瞭如下錯誤。
  這裏寫圖片描述java

 ![這裏寫圖片描述](http://img.blog.csdn.net/20180131183753474?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGhfQ2hhbw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
 我到這個異常的時候,我腦海中第一個想的就是:個人親爸爸難道不是我親爸爸?
 

問題緣由

  嘗試了一系列的測試都無果後,本來已經打算放棄了。想着從 shiro session 中取出來的對象實際上都是通過 redis 的反序列化以後取出來的,就順着思考會不會是類加載的問題。
  查了一下以後,發現我項目啓動時候加載項目當中的類所使用到的加載器是 org.springframework.boot.devtools.restart.classloader.RestartClassLoader , 這是由於以前在項目當中引入了 spring-boot-devtools 這個熱部署包來提升效率。而我從 shiro session 取對象時候所用到的類加載器並非這個,而是 sun.misc.Launcher.AppClassLoader ,從而致使個人類型的轉換的異常。redis

解決方案

  1. 不使用 spring-boot-devtools 熱部署
  2.在 resources 目錄下面建立 META_INF 文件夾,而後建立 spring-devtools.properties文件,文件加上相似下面的配置:spring

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
相關文章
相關標籤/搜索