Shiro集成JWT過(guò)濾器異常無(wú)法捕捉
因?yàn)镾pringBoot也是剛剛開(kāi)始自學(xué),差不多學(xué)個(gè)幾個(gè)小時(shí),放下個(gè)好幾天,一直學(xué)的磕磕絆絆的,
在shiro集成jwt時(shí)發(fā)現(xiàn)jwt拋出的異常,全局異常處理器無(wú)法捕捉,因?yàn)檎?qǐng)求會(huì)按照 filter -> interceptor -> controllerAdvice -> aspect -> controller的順序調(diào)用
所以RestControllerAdvice無(wú)法捕獲到過(guò)濾器的異常,
在網(wǎng)上找了好多的方式,大致有以下幾種
1.轉(zhuǎn)發(fā)方式
大致是在JWTFilter 新增responseError方法,修改executeLogin方法,在過(guò)濾器中捕獲到異常時(shí),httpServletResponse.sendRedirect 使用重定向到一個(gè)我們自定義的處理過(guò)濾器錯(cuò)誤的一個(gè)controller中,返回自定義格式的對(duì)象到前端。
2.修改ErrorController?
新建一個(gè)ErrorControllerImpl 實(shí)現(xiàn)ErrorController 把ErrorPath 指向error 再寫(xiě)一個(gè)方法把Error拋出 然后Controller全局統(tǒng)一異常處理RestControllerAdvice就能捕獲到異常了
這兩種方式都可以實(shí)現(xiàn),但是我只想簡(jiǎn)單的拋出一個(gè)異常而已,而且這兩種方式只能返回錯(cuò)誤,無(wú)法返回自定義狀態(tài)碼,想要返回自定義狀態(tài)碼,需要自行寫(xiě)邏輯判斷,有點(diǎn)懶,就沒(méi)用這種方式,本來(lái)想放棄了,就這樣吧,這兩種方式麻煩一點(diǎn),但也不是不能用,然后我突然發(fā)現(xiàn),在shiro自定義的Realm的doGetAuthenticationInfo方法中拋出的異常都無(wú)法捕捉了,我忍,因?yàn)榭|了一下執(zhí)行過(guò)程后,發(fā)現(xiàn)執(zhí)行doGetAuthenticationInfo的時(shí)候,還是在過(guò)濾器那里,所以也捕捉不到異常,然后我在過(guò)濾器中使用Autowired自動(dòng)注入了AdminService,在過(guò)濾器中查詢用戶信息,在按照上面兩種方式拋出異常不就可以了,結(jié)果報(bào)了空指針異常,研究半天,想著自動(dòng)注入不可行,那么使用ApplicationContext的getBean方式來(lái)獲取呢,結(jié)果可行,那么也可以使用使用這種方式來(lái)獲取handlerExceptionResolver,通過(guò)handlerExceptionResolver的resolveException來(lái)拋出異常啊,這樣也不用轉(zhuǎn)發(fā)或者修改ErrorController了
在啟動(dòng)文件同級(jí)的地方建立一個(gè)SpringContext

然后再過(guò)濾器中使用handlerExceptionResolver.resolveException來(lái)拋出異常
